perm filename BUGMF.PSC[MF,DEK] blob sn#786768 filedate 1985-02-16 generic text, type T, neo UTF8
{4:}{9:}{$C-,A+,D-,W+}{$C+,D:5,W+,Z:377777777777B}{[$D:2]}{:9}
PROGRAM MF;LABEL{6:}1,9998,9999;{:6}CONST{11:}MEMMAX=3000;
MAXINTERNAL=100;BUFSIZE=500;ERRORLINE=64;HALFERRORLIN=32;
MAXPRINTLINE=72;SCREENWIDTH=100;SCREENDEPTH=200;STACKSIZE=30;
MAXSTRINGS=1500;STRINGVACANC=8000;POOLSIZE=32000;MOVESIZE=5000;
MAXWIGGLE=100;GFBUFSIZE=8;FILENAMESIZE=23;
POOLNAME='MF.POOL[MF,SYS]        ';PATHSIZE=100;
COUNTNAME='<!MF!>.TXT[MF,SYS]     ';BISTACKSIZE=768;HEADERSIZE=100;
LIGTABLESIZE=300;MAXFONTDIMEN=50;{:11}TYPE{18:}ASCIICODE=0..127;{:18}
{24:}EIGHTBITS=0..255;ALPHAFILE=PACKED FILE OF CHAR;
BYTEFILE=PACKED FILE OF EIGHTBITS;{:24}{37:}POOLPOINTER=0..POOLSIZE;
STRNUMBER=0..MAXSTRINGS;{:37}{100:}SCALED=INTEGER;SMALLNUMBER=0..63;
{:100}{104:}FRACTION=INTEGER;{:104}{105:}ANGLE=INTEGER;{:105}{155:}
QUARTERWORD=0..255;HALFWORD=0..65535;TWOCHOICES=1..2;THREECHOICES=1..3;
TWOHALVES=PACKED RECORD RH:HALFWORD;CASE TWOCHOICES OF 1:(LH:HALFWORD);
2:(B0:QUARTERWORD;B1:QUARTERWORD);END;
FOURQUARTERS=PACKED RECORD B0:QUARTERWORD;B1:QUARTERWORD;B2:QUARTERWORD;
B3:QUARTERWORD;END;
MEMORYWORD=RECORD CASE THREECHOICES OF 1:(INT:INTEGER);2:(HH:TWOHALVES);
3:(QQQQ:FOURQUARTERS);END;WORDFILE=FILE OF MEMORYWORD;{:155}{185:}
COMMANDCODE=1..82;{:185}{551:}SCREENROW=0..SCREENDEPTH;
SCREENCOL=0..SCREENWIDTH;TRANSSPEC=ARRAY[SCREENCOL]OF SCREENCOL;
PIXELCOLOR=0..1;{:551}{557:}WINDOWNUMBER=0..15;{:557}{612:}
INSTATERECOR=RECORD INDEXFIELD:QUARTERWORD;
STARTFIELD,LOCFIELD,LIMITFIELD,NAMEFIELD:HALFWORD;END;{:612}{1131:}
GFINDEX=0..GFBUFSIZE;PACKEDBYTES=PACKED ARRAY[GFINDEX]OF EIGHTBITS;
{:1131}VAR{13:}BAD:INTEGER;{:13}{20:}XORD:ARRAY[CHAR]OF ASCIICODE;
XCHR:ARRAY[ASCIICODE]OF CHAR;{:20}{25:}
NAMEOFFILE:PACKED ARRAY[1..FILENAMESIZE]OF CHAR;
NAMELENGTH:0..FILENAMESIZE;{:25}{29:}
BUFFER:ARRAY[0..BUFSIZE]OF ASCIICODE;FIRST:0..BUFSIZE;LAST:0..BUFSIZE;
MAXBUFSTACK:0..BUFSIZE;AUXBUF:ARRAY[0..70]OF CHAR;{:29}{38:}
STRPOOL:PACKED ARRAY[POOLPOINTER]OF ASCIICODE;
STRSTART:ARRAY[STRNUMBER]OF POOLPOINTER;POOLPTR:POOLPOINTER;
STRPTR:STRNUMBER;INITPOOLPTR:POOLPOINTER;INITSTRPTR:STRNUMBER;
MAXPOOLPTR:POOLPOINTER;MAXSTRPTR:STRNUMBER;{:38}{42:}
STRREF:ARRAY[STRNUMBER]OF 0..127;{:42}{50:}POOLFILE:ALPHAFILE;{:50}{54:}
LOGFILE:ALPHAFILE;SELECTOR:0..5;DIG:ARRAY[0..22]OF 0..15;TALLY:INTEGER;
TERMOFFSET:0..MAXPRINTLINE;FILEOFFSET:0..MAXPRINTLINE;
TRICKBUF:ARRAY[0..ERRORLINE]OF ASCIICODE;TRICKCOUNT:INTEGER;
FIRSTCOUNT:INTEGER;{:54}{68:}INTERACTION:0..3;{:68}{71:}
DELETIONSALL:BOOLEAN;HISTORY:0..3;ERRORCOUNT:-1..100;{:71}{74:}
HELPLINE:ARRAY[0..5]OF STRNUMBER;HELPPTR:0..6;USEERRHELP:BOOLEAN;
ERRHELP:STRNUMBER;{:74}{90:}INTERRUPT:INTEGER;OKTOINTERRUP:BOOLEAN;{:90}
{96:}ARITHERROR:BOOLEAN;{:96}{128:}TWOTOTHE:ARRAY[0..30]OF INTEGER;
SPECLOG:ARRAY[1..28]OF INTEGER;{:128}{136:}
SPECATAN:ARRAY[1..26]OF ANGLE;{:136}{143:}NSIN,NCOS:FRACTION;{:143}
{147:}RANDOMS:ARRAY[0..54]OF FRACTION;JRANDOM:0..54;{:147}{157:}
TEMPPTR:HALFWORD;{:157}{158:}MEM:ARRAY[0..MEMMAX]OF MEMORYWORD;
LOMEMMAX:HALFWORD;HIMEMMIN:HALFWORD;{:158}{159:}VARUSED,DYNUSED:INTEGER;
{:159}{160:}AVAIL:HALFWORD;MEMEND:HALFWORD;{:160}{165:}ROVER:HALFWORD;
{:165}{177:}FREE:PACKED ARRAY[0..MEMMAX]OF BOOLEAN;
WASFREE:PACKED ARRAY[0..MEMMAX]OF BOOLEAN;
WASMEMEND,WASLOMAX,WASHIMIN:HALFWORD;PANICKING:BOOLEAN;{:177}{189:}
INTERNAL:ARRAY[1..MAXINTERNAL]OF SCALED;
INTNAME:ARRAY[1..MAXINTERNAL]OF STRNUMBER;INTPTR:38..MAXINTERNAL;{:189}
{195:}OLDSETTING:0..5;{:195}{197:}CHARCLASS:ARRAY[ASCIICODE]OF 0..21;
{:197}{199:}HASHUSED:HALFWORD;STCOUNT:INTEGER;{:199}{200:}
HASH:ARRAY[1..2242]OF TWOHALVES;EQTB:ARRAY[1..2242]OF TWOHALVES;{:200}
{224:}GPOINTER:HALFWORD;{:224}{229:}
BIGNODESIZE:ARRAY[13..14]OF SMALLNUMBER;{:229}{249:}SAVEPTR:HALFWORD;
{:249}{266:}PATHTAIL:HALFWORD;{:266}{278:}
DELTAX,DELTAY,DELTA:ARRAY[0..PATHSIZE]OF SCALED;
PSI:ARRAY[1..PATHSIZE]OF ANGLE;{:278}{282:}
THETA:ARRAY[0..PATHSIZE]OF ANGLE;UU:ARRAY[0..PATHSIZE]OF FRACTION;
VV:ARRAY[0..PATHSIZE]OF ANGLE;WW:ARRAY[0..PATHSIZE]OF FRACTION;{:282}
{297:}ST,CT,SF,CF:FRACTION;{:297}{307:}
MOVE:ARRAY[0..MOVESIZE]OF INTEGER;MOVEPTR:0..MOVESIZE;{:307}{308:}
BISECTSTACK:ARRAY[0..BISTACKSIZE]OF INTEGER;BISECTPTR:0..BISTACKSIZE;
{:308}{326:}CUREDGES:HALFWORD;CURWT:INTEGER;{:326}{366:}TRACEX:INTEGER;
TRACEY:INTEGER;TRACEYY:INTEGER;{:366}{374:}OCTANT:1..8;{:374}{384:}
CURX,CURY:SCALED;{:384}{393:}CURSPEC:HALFWORD;TURNINGNUMBE:INTEGER;
CURPEN:HALFWORD;CURPATHTYPE:0..2;MAXALLOWED:SCALED;{:393}{416:}
BEFORE,AFTER:ARRAY[0..MAXWIGGLE]OF SCALED;
NODETOROUND:ARRAY[0..MAXWIGGLE]OF HALFWORD;CURROUNDINGP:0..MAXWIGGLE;
MAXROUNDINGP:0..MAXWIGGLE;{:416}{419:}CURGRAN:SCALED;{:419}{437:}
OCTANTNUMBER:ARRAY[1..8]OF 1..8;OCTANTCODE:ARRAY[1..8]OF 1..8;{:437}
{448:}YCORR,XYCORR,ZCORR:ARRAY[1..8]OF 0..1;XCORR:ARRAY[1..8]OF-1..1;
{:448}{451:}M0,N0,M1,N1:INTEGER;D0,D1:0..1;{:451}{494:}
ENVMOVE:ARRAY[0..MOVESIZE]OF INTEGER;{:494}{541:}CURT,CURTT:INTEGER;
TIMETOGO:INTEGER;{:541}{543:}DELX,DELY:INTEGER;UV,XY:0..BISTACKSIZE;
{:543}{552:}{SCREENPIXEL:ARRAY[SCREENROW,SCREENCOL]OF PIXELCOLOR;}{:552}
{555:}SCREENSTARTE:BOOLEAN;SCREENOK:BOOLEAN;{:555}{558:}
WINDOWOPEN:ARRAY[WINDOWNUMBER]OF BOOLEAN;
LEFTCOL:ARRAY[WINDOWNUMBER]OF SCREENCOL;
RIGHTCOL:ARRAY[WINDOWNUMBER]OF SCREENCOL;
TOPROW:ARRAY[WINDOWNUMBER]OF SCREENROW;
BOTROW:ARRAY[WINDOWNUMBER]OF SCREENROW;
MWINDOW:ARRAY[WINDOWNUMBER]OF INTEGER;
NWINDOW:ARRAY[WINDOWNUMBER]OF INTEGER;
WINDOWTIME:ARRAY[WINDOWNUMBER]OF INTEGER;{:558}{565:}
ROWTRANSITIO:TRANSSPEC;{:565}{577:}FIXNEEDED:BOOLEAN;WATCHCOEFS:BOOLEAN;
DEPFINAL:HALFWORD;{:577}{609:}CURCMD:EIGHTBITS;CURMOD:INTEGER;
CURSYM:HALFWORD;{:609}{613:}
INPUTSTACK:ARRAY[0..STACKSIZE]OF INSTATERECOR;INPUTPTR:0..STACKSIZE;
MAXINSTACK:0..STACKSIZE;CURINPUT:INSTATERECOR;{:613}{616:}INOPEN:0..6;
INPUTFILE:ARRAY[1..6]OF ALPHAFILE;LINE:INTEGER;
LINESTACK:ARRAY[1..6]OF INTEGER;PAGE:INTEGER;
PAGESTACK:ARRAY[1..6]OF INTEGER;{:616}{618:}
PARAMSTACK:ARRAY[0..150]OF HALFWORD;PARAMPTR:0..150;
MAXPARAMSTAC:INTEGER;{:618}{619:}FILEPTR:0..STACKSIZE;{:619}{644:}
SCANNERSTATU:0..6;WARNINGINFO:INTEGER;{:644}{665:}FORCEEOF:BOOLEAN;
{:665}{722:}CONDPTR:HALFWORD;IFLIMIT:0..4;CURIF:SMALLNUMBER;
IFLINE:INTEGER;{:722}{736:}LOOPPTR:HALFWORD;{:736}{751:}
CURNAME:STRNUMBER;CURAREA:STRNUMBER;CUREXT:STRNUMBER;{:751}{752:}
AREADELIMITE:POOLPOINTER;EXTDELIMITER:POOLPOINTER;{:752}{759:}
MFBASEDEFAUL:PACKED ARRAY[1..17]OF CHAR;{:759}{766:}JOBNAME:STRNUMBER;
LOGNAME:STRNUMBER;{:766}{774:}GFFILE:BYTEFILE;OUTPUTFILENA:STRNUMBER;
{:774}{779:}CURTYPE:SMALLNUMBER;CUREXP:INTEGER;{:779}{796:}
MAXC:ARRAY[16..17]OF INTEGER;MAXPTR:ARRAY[16..17]OF HALFWORD;
MAXLINK:ARRAY[16..17]OF HALFWORD;{:796}{804:}VARFLAG:0..82;{:804}{937:}
TXX,TXY,TYX,TYY,TX,TY:SCALED;{:937}{1058:}STARTSYM:HALFWORD;{:1058}
{1065:}LONGHELPSEEN:BOOLEAN;{:1065}{1068:}TFMFILE:BYTEFILE;
METRICFILENA:STRNUMBER;{:1068}{1077:}BC,EC:EIGHTBITS;
TFMWIDTH:ARRAY[EIGHTBITS]OF SCALED;TFMHEIGHT:ARRAY[EIGHTBITS]OF SCALED;
TFMDEPTH:ARRAY[EIGHTBITS]OF SCALED;
TFMITALCORR:ARRAY[EIGHTBITS]OF SCALED;
CHAREXISTS:ARRAY[EIGHTBITS]OF BOOLEAN;CHARTAG:ARRAY[EIGHTBITS]OF 0..3;
CHARREMAINDE:ARRAY[EIGHTBITS]OF EIGHTBITS;
HEADERBYTE:ARRAY[1..HEADERSIZE]OF-1..255;
LIGKERN:ARRAY[0..LIGTABLESIZE]OF FOURQUARTERS;NL:0..LIGTABLESIZE;
KERN:ARRAY[EIGHTBITS]OF SCALED;NK:0..256;
EXTEN:ARRAY[EIGHTBITS]OF FOURQUARTERS;NE:0..256;
PARAM:ARRAY[1..MAXFONTDIMEN]OF SCALED;NP:0..MAXFONTDIMEN;
NW,NH,ND,NI:0..256;{:1077}{1100:}PERTURBATION:SCALED;{:1100}{1106:}
DIMENHEAD:ARRAY[1..4]OF HALFWORD;{:1106}{1117:}MAXTFMDIMEN:SCALED;
TFMCHANGED:INTEGER;{:1117}{1129:}GFMINM,GFMAXM,GFMINN,GFMAXN:INTEGER;
GFPREVPTR:INTEGER;TOTALCHARS:INTEGER;CHARPTR:ARRAY[EIGHTBITS]OF INTEGER;
GFDX,GFDY:ARRAY[EIGHTBITS]OF INTEGER;{:1129}{1132:}GFBUF:PACKEDBYTES;
HALFBUF:GFINDEX;GFLIMIT:GFINDEX;GFPTR:GFINDEX;GFOFFSET:INTEGER;{:1132}
{1142:}BOCC,BOCP:INTEGER;{:1142}{1163:}BASEIDENT:STRNUMBER;{:1163}
{1168:}BASEFILE:WORDFILE;{:1168}{1183:}READYALREADY:INTEGER;{:1183}
{1195:}PSEUDOTYPEIN:STRNUMBER;{:1195}{1197:}{COUNTFILE:ALPHAFILE;}
{:1197}{1198:}HACK,MEMRY:PACKED RECORD CASE INTEGER OF 0:(XX:0..262143;
P:↑INTEGER);1:(Z:INTEGER);2:(LH:0..262143;RH:0..262143);
3:(SIXBIT:PACKED ARRAY[1..6]OF 0..63)END;NUMCOUNTS:INTEGER;
JOBHRL:INTEGER;{:1198}{1205:}ESCBREAK:ARRAY[1..1]OF INTEGER;{:1205}
PROCEDURE INITIALIZE;VAR{19:}I:0..127;{:19}{129:}K:INTEGER;{:129}
BEGIN{21:}XCHR[32]:=' ';XCHR[33]:='!';XCHR[34]:='"';XCHR[35]:='#';
XCHR[36]:='$';XCHR[37]:='%';XCHR[38]:='&';XCHR[39]:='''';XCHR[40]:='(';
XCHR[41]:=')';XCHR[42]:='*';XCHR[43]:='+';XCHR[44]:=',';XCHR[45]:='-';
XCHR[46]:='.';XCHR[47]:='/';XCHR[48]:='0';XCHR[49]:='1';XCHR[50]:='2';
XCHR[51]:='3';XCHR[52]:='4';XCHR[53]:='5';XCHR[54]:='6';XCHR[55]:='7';
XCHR[56]:='8';XCHR[57]:='9';XCHR[58]:=':';XCHR[59]:=';';XCHR[60]:='<';
XCHR[61]:='=';XCHR[62]:='>';XCHR[63]:='?';XCHR[64]:='@';XCHR[65]:='A';
XCHR[66]:='B';XCHR[67]:='C';XCHR[68]:='D';XCHR[69]:='E';XCHR[70]:='F';
XCHR[71]:='G';XCHR[72]:='H';XCHR[73]:='I';XCHR[74]:='J';XCHR[75]:='K';
XCHR[76]:='L';XCHR[77]:='M';XCHR[78]:='N';XCHR[79]:='O';XCHR[80]:='P';
XCHR[81]:='Q';XCHR[82]:='R';XCHR[83]:='S';XCHR[84]:='T';XCHR[85]:='U';
XCHR[86]:='V';XCHR[87]:='W';XCHR[88]:='X';XCHR[89]:='Y';XCHR[90]:='Z';
XCHR[91]:='[';XCHR[92]:='\';XCHR[93]:=']';XCHR[94]:='↑';XCHR[95]:='_';
XCHR[96]:='`';XCHR[97]:='a';XCHR[98]:='b';XCHR[99]:='c';XCHR[100]:='d';
XCHR[101]:='e';XCHR[102]:='f';XCHR[103]:='g';XCHR[104]:='h';
XCHR[105]:='i';XCHR[106]:='j';XCHR[107]:='k';XCHR[108]:='l';
XCHR[109]:='m';XCHR[110]:='n';XCHR[111]:='o';XCHR[112]:='p';
XCHR[113]:='q';XCHR[114]:='r';XCHR[115]:='s';XCHR[116]:='t';
XCHR[117]:='u';XCHR[118]:='v';XCHR[119]:='w';XCHR[120]:='x';
XCHR[121]:='y';XCHR[122]:='z';XCHR[123]:='{';XCHR[124]:='|';
XCHR[125]:='}';XCHR[126]:='~';XCHR[0]:=' ';XCHR[127]:=' ';{:21}{22:}
FOR I:=1 TO 31 DO XCHR[I]:=CHR(I);XCHR[24]:=CHR(95);XCHR[26]:=CHR(27);
XCHR[27]:=CHR(126);{:22}{23:}FOR I:=0 TO 127 DO XORD[CHR(I)]:=127;
FOR I:=1 TO 126 DO XORD[XCHR[I]]:=I;XORD[CHR(9)]:=32;{:23}{69:}
INTERACTION:=3;{:69}{72:}DELETIONSALL:=TRUE;ERRORCOUNT:=0;{:72}{75:}
HELPPTR:=0;USEERRHELP:=FALSE;ERRHELP:=0;{:75}{91:}INTERRUPT:=0;
OKTOINTERRUP:=TRUE;{:91}{97:}ARITHERROR:=FALSE;{:97}{130:}
TWOTOTHE[0]:=1;FOR K:=1 TO 30 DO TWOTOTHE[K]:=2*TWOTOTHE[K-1];
SPECLOG[1]:=93032640;SPECLOG[2]:=38612034;SPECLOG[3]:=17922280;
SPECLOG[4]:=8662214;SPECLOG[5]:=4261238;SPECLOG[6]:=2113709;
SPECLOG[7]:=1052693;SPECLOG[8]:=525315;SPECLOG[9]:=262400;
SPECLOG[10]:=131136;SPECLOG[11]:=65552;SPECLOG[12]:=32772;
SPECLOG[13]:=16385;FOR K:=14 TO 27 DO SPECLOG[K]:=TWOTOTHE[27-K];
SPECLOG[28]:=1;{:130}{137:}SPECATAN[1]:=27855475;SPECATAN[2]:=14718068;
SPECATAN[3]:=7471121;SPECATAN[4]:=3750058;SPECATAN[5]:=1876857;
SPECATAN[6]:=938658;SPECATAN[7]:=469357;SPECATAN[8]:=234682;
SPECATAN[9]:=117342;SPECATAN[10]:=58671;SPECATAN[11]:=29335;
SPECATAN[12]:=14668;SPECATAN[13]:=7334;SPECATAN[14]:=3667;
SPECATAN[15]:=1833;SPECATAN[16]:=917;SPECATAN[17]:=458;
SPECATAN[18]:=229;SPECATAN[19]:=115;SPECATAN[20]:=57;SPECATAN[21]:=29;
SPECATAN[22]:=14;SPECATAN[23]:=7;SPECATAN[24]:=4;SPECATAN[25]:=2;
SPECATAN[26]:=1;{:137}{178:}WASMEMEND:=0;WASLOMAX:=0;WASHIMIN:=MEMMAX;
PANICKING:=FALSE;{:178}{190:}FOR K:=1 TO 38 DO INTERNAL[K]:=0;
INTPTR:=38;{:190}{198:}FOR K:=48 TO 57 DO CHARCLASS[K]:=0;
CHARCLASS[46]:=1;CHARCLASS[32]:=2;CHARCLASS[37]:=3;CHARCLASS[34]:=4;
CHARCLASS[44]:=5;CHARCLASS[59]:=6;CHARCLASS[40]:=7;CHARCLASS[41]:=8;
FOR K:=65 TO 90 DO CHARCLASS[K]:=9;FOR K:=97 TO 122 DO CHARCLASS[K]:=9;
CHARCLASS[95]:=9;CHARCLASS[60]:=10;CHARCLASS[61]:=10;CHARCLASS[62]:=10;
CHARCLASS[58]:=10;CHARCLASS[124]:=10;CHARCLASS[96]:=11;
CHARCLASS[39]:=11;CHARCLASS[43]:=12;CHARCLASS[45]:=12;CHARCLASS[47]:=13;
CHARCLASS[42]:=13;CHARCLASS[92]:=13;CHARCLASS[33]:=14;CHARCLASS[63]:=14;
CHARCLASS[35]:=15;CHARCLASS[38]:=15;CHARCLASS[64]:=15;CHARCLASS[36]:=15;
CHARCLASS[94]:=16;CHARCLASS[126]:=16;CHARCLASS[91]:=17;
CHARCLASS[93]:=18;CHARCLASS[123]:=19;CHARCLASS[125]:=19;
FOR K:=0 TO 31 DO CHARCLASS[K]:=20;CHARCLASS[24]:=10;CHARCLASS[26]:=10;
CHARCLASS[28]:=10;CHARCLASS[29]:=10;CHARCLASS[12]:=21;
CHARCLASS[127]:=20;{:198}{201:}HASH[1].LH:=0;HASH[1].RH:=0;
EQTB[1].LH:=41;EQTB[1].RH:=0;FOR K:=2 TO 2242 DO BEGIN HASH[K]:=HASH[1];
EQTB[K]:=EQTB[1];END;{:201}{230:}BIGNODESIZE[13]:=12;BIGNODESIZE[14]:=4;
{:230}{250:}SAVEPTR:=0;{:250}{417:}MAXROUNDINGP:=0;{:417}{438:}
OCTANTCODE[1]:=1;OCTANTCODE[2]:=5;OCTANTCODE[3]:=6;OCTANTCODE[4]:=2;
OCTANTCODE[5]:=4;OCTANTCODE[6]:=8;OCTANTCODE[7]:=7;OCTANTCODE[8]:=3;
FOR K:=1 TO 8 DO OCTANTNUMBER[OCTANTCODE[K]]:=K;{:438}{449:}XCORR[1]:=0;
YCORR[1]:=0;XYCORR[1]:=0;XCORR[5]:=0;YCORR[5]:=0;XYCORR[5]:=1;
XCORR[6]:=-1;YCORR[6]:=1;XYCORR[6]:=0;XCORR[2]:=1;YCORR[2]:=0;
XYCORR[2]:=1;XCORR[4]:=0;YCORR[4]:=1;XYCORR[4]:=1;XCORR[8]:=0;
YCORR[8]:=1;XYCORR[8]:=0;XCORR[7]:=1;YCORR[7]:=0;XYCORR[7]:=1;
XCORR[3]:=-1;YCORR[3]:=1;XYCORR[3]:=0;
FOR K:=1 TO 8 DO ZCORR[K]:=XYCORR[K]-XCORR[K];{:449}{556:}
SCREENSTARTE:=FALSE;SCREENOK:=FALSE;{:556}{559:}
FOR K:=0 TO 15 DO BEGIN WINDOWOPEN[K]:=FALSE;WINDOWTIME[K]:=0;END;{:559}
{578:}FIXNEEDED:=FALSE;WATCHCOEFS:=TRUE;{:578}{723:}CONDPTR:=0;
IFLIMIT:=0;CURIF:=0;IFLINE:=0;{:723}{737:}LOOPPTR:=0;{:737}{760:}
MFBASEDEFAUL:='PLAIN.bas[mf,sys]';{:760}{780:}CUREXP:=0;{:780}{805:}
VARFLAG:=0;{:805}{1059:}STARTSYM:=0;{:1059}{1066:}LONGHELPSEEN:=FALSE;
{:1066}{1078:}FOR K:=0 TO 255 DO BEGIN TFMWIDTH[K]:=0;TFMHEIGHT[K]:=0;
TFMDEPTH[K]:=0;TFMITALCORR[K]:=0;CHAREXISTS[K]:=FALSE;CHARTAG[K]:=0;
CHARREMAINDE[K]:=0;END;FOR K:=1 TO HEADERSIZE DO HEADERBYTE[K]:=-1;
BC:=255;EC:=0;NL:=0;NK:=0;NE:=0;NP:=0;{:1078}{1130:}GFPREVPTR:=0;
TOTALCHARS:=0;{:1130}{1133:}HALFBUF:=GFBUFSIZE DIV 2;GFLIMIT:=GFBUFSIZE;
GFPTR:=0;GFOFFSET:=0;{:1133}{1164:}BASEIDENT:=0;{:1164}{1196:}
PSEUDOTYPEIN:=0;PAGE:=0;{:1196}END;{57:}PROCEDURE PRINTLN;
BEGIN CASE SELECTOR OF 3:BEGIN WRITELN(TTY);WRITELN(LOGFILE);
TERMOFFSET:=0;FILEOFFSET:=0;END;2:BEGIN WRITELN(LOGFILE);FILEOFFSET:=0;
END;1:BEGIN WRITELN(TTY);TERMOFFSET:=0;END;0,4,5:;END;END;{:57}{58:}
PROCEDURE PRINTCHAR(S:ASCIICODE);
BEGIN CASE SELECTOR OF 3:BEGIN WRITE(TTY,XCHR[S]);
WRITE(LOGFILE,XCHR[S]);TERMOFFSET:=TERMOFFSET+1;
FILEOFFSET:=FILEOFFSET+1;
IF TERMOFFSET=MAXPRINTLINE THEN BEGIN WRITELN(TTY);TERMOFFSET:=0;END;
IF FILEOFFSET=MAXPRINTLINE THEN BEGIN WRITELN(LOGFILE);FILEOFFSET:=0;
END;END;2:BEGIN WRITE(LOGFILE,XCHR[S]);FILEOFFSET:=FILEOFFSET+1;
IF FILEOFFSET=MAXPRINTLINE THEN PRINTLN;END;1:BEGIN WRITE(TTY,XCHR[S]);
TERMOFFSET:=TERMOFFSET+1;IF TERMOFFSET=MAXPRINTLINE THEN PRINTLN;END;0:;
4:IF TALLY<TRICKCOUNT THEN TRICKBUF[TALLY MOD ERRORLINE]:=S;
5:BEGIN IF POOLPTR<POOLSIZE THEN BEGIN STRPOOL[POOLPTR]:=S;
POOLPTR:=POOLPTR+1;END;END;END;TALLY:=TALLY+1;END;{:58}{59:}
PROCEDURE PRINT(S:INTEGER);VAR J:POOLPOINTER;
BEGIN IF(S<0)OR(S>=STRPTR)THEN S:=131;J:=STRSTART[S];
WHILE J<STRSTART[S+1]DO BEGIN PRINTCHAR(STRPOOL[J]);J:=J+1;END;END;{:59}
{60:}PROCEDURE SLOWPRINT(S:INTEGER);VAR J:POOLPOINTER;
BEGIN IF(S<0)OR(S>=STRPTR)THEN S:=131;J:=STRSTART[S];
WHILE J<STRSTART[S+1]DO BEGIN PRINT(STRPOOL[J]);J:=J+1;END;END;{:60}
{62:}PROCEDURE PRINTNL(S:STRNUMBER);
BEGIN IF((TERMOFFSET>0)AND(ODD(SELECTOR)))OR((FILEOFFSET>0)AND(SELECTOR
>=2))THEN PRINTLN;PRINT(S);END;{:62}{63:}
PROCEDURE PRINTTHEDIGS(K:EIGHTBITS);BEGIN WHILE K>0 DO BEGIN K:=K-1;
PRINTCHAR(48+DIG[K]);END;END;{:63}{64:}PROCEDURE PRINTINT(N:INTEGER);
VAR K:0..23;M:INTEGER;BEGIN K:=0;IF N<0 THEN BEGIN PRINTCHAR(45);
IF N>-100000000 THEN N:=-N ELSE BEGIN M:=-1-N;N:=M DIV 10;
M:=(M MOD 10)+1;K:=1;IF M<10 THEN DIG[0]:=M ELSE BEGIN DIG[0]:=0;N:=N+1;
END;END;END;REPEAT DIG[K]:=N MOD 10;N:=N DIV 10;K:=K+1;UNTIL N=0;
PRINTTHEDIGS(K);END;{:64}{102:}PROCEDURE PRINTSCALED(S:SCALED);
VAR DELTA:SCALED;BEGIN IF S<0 THEN BEGIN PRINTCHAR(45);S:=-S;END;
PRINTINT(S DIV 65536);S:=10*(S MOD 65536)+5;
IF S<>5 THEN BEGIN DELTA:=10;PRINTCHAR(46);
REPEAT IF DELTA>65536 THEN S:=S+32768-(DELTA DIV 2);
PRINTCHAR(48+(S DIV 65536));S:=10*(S MOD 65536);DELTA:=DELTA*10;
UNTIL S<=DELTA;END;END;{:102}{103:}PROCEDURE PRINTTWO(X,Y:SCALED);
BEGIN PRINTCHAR(40);PRINTSCALED(X);PRINTCHAR(44);PRINTSCALED(Y);
PRINTCHAR(41);END;{:103}{186:}PROCEDURE PRINTTYPE(T:SMALLNUMBER);
BEGIN CASE T OF 1:PRINT(198);2:PRINT(199);3:PRINT(200);4:PRINT(201);
5:PRINT(202);6:PRINT(203);7:PRINT(204);8:PRINT(205);9:PRINT(206);
10:PRINT(207);11:PRINT(208);12:PRINT(209);13:PRINT(210);14:PRINT(211);
15:PRINT(212);16:PRINT(213);17:PRINT(214);18:PRINT(215);19:PRINT(216);
20:PRINT(217);21:PRINT(218);22:PRINT(219);23:PRINT(220);
OTHERS:PRINT(221)END;END;{:186}{194:}PROCEDURE BEGINDIAGNOS;
BEGIN OLDSETTING:=SELECTOR;
IF(INTERNAL[12]<=0)AND(SELECTOR=3)THEN BEGIN SELECTOR:=SELECTOR-1;
IF HISTORY=0 THEN HISTORY:=1;END;END;
PROCEDURE ENDDIAGNOSTI(BLANKLINE:BOOLEAN);BEGIN PRINTNL(157);
IF BLANKLINE THEN PRINTLN;SELECTOR:=OLDSETTING;END;{:194}{196:}
PROCEDURE PRINTDIAGNOS(S,T:STRNUMBER;NULINE:BOOLEAN);BEGIN BEGINDIAGNOS;
IF NULINE THEN PRINTNL(S)ELSE PRINT(S);PRINT(322);PRINTINT(LINE);
PRINT(T);PRINTCHAR(58);END;{:196}{757:}
PROCEDURE PRINTFILENAM(N,A,E:INTEGER);BEGIN PRINT(N);PRINT(E);PRINT(A);
END;{:757}{33:}FUNCTION INSKP0:BOOLEAN;EXTERN;PROCEDURE WAKEUPTERMIN;
VAR VAL:INTEGER;SUCCESS:BOOLEAN;BEGIN BEGIN IF INSKP0 THEN END;
ESCBREAK[1]:=536870912+ORD('N');CALLI(131153,-1,ESCBREAK,VAL,SUCCESS);
END;{:33}{73:}PROCEDURE NORMALIZESEL;FORWARD;PROCEDURE GETNEXT;FORWARD;
PROCEDURE TERMINPUT;FORWARD;PROCEDURE SHOWCONTEXT;FORWARD;
PROCEDURE BEGINFILEREA;FORWARD;PROCEDURE OPENLOGFILE;FORWARD;
PROCEDURE CLOSEFILESAN;FORWARD;PROCEDURE CLEARFORERRO;FORWARD;
PROCEDURE DEBUGHELP;FORWARD;{43:}PROCEDURE FLUSHSTRING(S:STRNUMBER);
BEGIN IF S<STRPTR-1 THEN STRREF[S]:=0 ELSE REPEAT STRPTR:=STRPTR-1;
UNTIL STRREF[STRPTR-1]<>0;POOLPTR:=STRSTART[STRPTR];END;{:43}{:73}{76:}
PROCEDURE JUMPOUT;BEGIN GOTO 9998;END;{:76}{77:}PROCEDURE ERROR;
LABEL 22,10;VAR C:ASCIICODE;S1,S2,S3:INTEGER;
BEGIN IF HISTORY<2 THEN HISTORY:=2;PRINTCHAR(46);SHOWCONTEXT;
IF INTERACTION=3 THEN{78:}WHILE TRUE DO BEGIN 22:CLEARFORERRO;
BEGIN BEGIN IF INSKP0 THEN END;PRINT(135);TERMINPUT;END;
IF LAST=FIRST THEN GOTO 10;C:=BUFFER[FIRST];IF C>=97 THEN C:=C-32;{79:}
CASE C OF 48,49,50,51,52,53,54,55,56,57:IF DELETIONSALL THEN{83:}
BEGIN S1:=CURCMD;S2:=CURMOD;S3:=CURSYM;OKTOINTERRUP:=FALSE;
IF(LAST>FIRST+1)AND(BUFFER[FIRST+1]>=48)AND(BUFFER[FIRST+1]<=57)THEN C:=
C*10+BUFFER[FIRST+1]-48*11 ELSE C:=C-48;WHILE C>0 DO BEGIN GETNEXT;
{727:}
IF CURCMD=39 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:727}
;C:=C-1;END;CURCMD:=S1;CURMOD:=S2;CURSYM:=S3;OKTOINTERRUP:=TRUE;
BEGIN HELPPTR:=2;HELPLINE[1]:=150;HELPLINE[0]:=151;END;SHOWCONTEXT;
GOTO 22;END{:83};68:BEGIN DEBUGHELP;GOTO 22;END;
69,84:IF FILEPTR>0 THEN BEGIN SELECTOR:=5;POOLPTR:=STRSTART[STRPTR];
PRINT(136);PRINT(INPUTSTACK[FILEPTR].NAMEFIELD);PRINTCHAR(47);
PRINTINT(PAGE);PRINT(137);PRINTINT(LINE);PRINTCHAR(108);PRINTCHAR(13);
IF STRPTR<MAXSTRINGS THEN BEGIN PSEUDOTYPEIN:=STRPTR;STRPTR:=STRPTR+1;
STRSTART[STRPTR]:=POOLPTR;END;SELECTOR:=3;INTERACTION:=2;JUMPOUT;END;
72:{84:}BEGIN IF USEERRHELP THEN BEGIN SLOWPRINT(ERRHELP);
USEERRHELP:=FALSE;END ELSE BEGIN IF HELPPTR=0 THEN BEGIN HELPPTR:=2;
HELPLINE[1]:=152;HELPLINE[0]:=153;END;REPEAT HELPPTR:=HELPPTR-1;
PRINT(HELPLINE[HELPPTR]);PRINTLN;UNTIL HELPPTR=0;END;BEGIN HELPPTR:=4;
HELPLINE[3]:=154;HELPLINE[2]:=153;HELPLINE[1]:=155;HELPLINE[0]:=156;END;
GOTO 22;END{:84};73:{82:}BEGIN BEGINFILEREA;
IF LAST>FIRST+1 THEN BEGIN CURINPUT.LOCFIELD:=FIRST+1;BUFFER[FIRST]:=32;
END ELSE BEGIN BEGIN BEGIN IF INSKP0 THEN END;PRINT(149);TERMINPUT;END;
CURINPUT.LOCFIELD:=FIRST;END;FIRST:=LAST+1;CURINPUT.LIMITFIELD:=LAST;
GOTO 10;END{:82};81,82,83:{81:}BEGIN ERRORCOUNT:=0;INTERACTION:=0+C-81;
PRINT(144);CASE C OF 81:BEGIN PRINT(145);SELECTOR:=SELECTOR-1;END;
82:PRINT(146);83:PRINT(147);END;PRINT(148);PRINTLN;BREAK(TTY);GOTO 10;
END{:81};88:BEGIN INTERACTION:=2;JUMPOUT;END;OTHERS:END;{80:}
BEGIN PRINT(138);PRINTNL(139);PRINTNL(140);IF FILEPTR>0 THEN PRINT(141);
IF DELETIONSALL THEN PRINTNL(142);PRINTNL(143);END{:80}{:79};END{:78};
ERRORCOUNT:=ERRORCOUNT+1;IF ERRORCOUNT=100 THEN BEGIN PRINTNL(134);
HISTORY:=3;JUMPOUT;END;{85:}IF INTERACTION>0 THEN SELECTOR:=SELECTOR-1;
IF USEERRHELP THEN BEGIN PRINTNL(157);SLOWPRINT(ERRHELP);
END ELSE WHILE HELPPTR>0 DO BEGIN HELPPTR:=HELPPTR-1;
PRINTNL(HELPLINE[HELPPTR]);END;PRINTLN;
IF INTERACTION>0 THEN SELECTOR:=SELECTOR+1;PRINTLN{:85};10:END;{:77}
{87:}PROCEDURE FATALERROR(S:STRNUMBER);BEGIN NORMALIZESEL;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(158);END;
BEGIN HELPPTR:=1;HELPLINE[0]:=S;END;
BEGIN IF INTERACTION=3 THEN INTERACTION:=2;ERROR;
IF INTERACTION>0 THEN DEBUGHELP;HISTORY:=3;JUMPOUT;END;END;{:87}{88:}
PROCEDURE OVERFLOW(S:STRNUMBER;N:INTEGER);BEGIN NORMALIZESEL;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(159);END;
PRINT(S);PRINTCHAR(61);PRINTINT(N);PRINTCHAR(93);BEGIN HELPPTR:=2;
HELPLINE[1]:=160;HELPLINE[0]:=161;END;
BEGIN IF INTERACTION=3 THEN INTERACTION:=2;ERROR;
IF INTERACTION>0 THEN DEBUGHELP;HISTORY:=3;JUMPOUT;END;END;{:88}{89:}
PROCEDURE CONFUSION(S:STRNUMBER);BEGIN NORMALIZESEL;
IF HISTORY<2 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(162);END;PRINT(S);PRINTCHAR(41);BEGIN HELPPTR:=1;
HELPLINE[0]:=163;END;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(164);END;BEGIN HELPPTR:=2;HELPLINE[1]:=165;HELPLINE[0]:=166;END;
END;BEGIN IF INTERACTION=3 THEN INTERACTION:=2;ERROR;
IF INTERACTION>0 THEN DEBUGHELP;HISTORY:=3;JUMPOUT;END;END;{:89}{:4}
{26:}FUNCTION ERSTAT(VAR F:FILE):INTEGER;EXTERN;
FUNCTION AOPENIN(VAR F:ALPHAFILE):BOOLEAN;
BEGIN RESET(F,NAMEOFFILE,'/E/O/N:9');AOPENIN:=ERSTAT(F)MOD 8192=0;END;
FUNCTION AOPENOUT(VAR F:ALPHAFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/O/N:2');AOPENOUT:=ERSTAT(F)MOD 8192=0;END;
FUNCTION BOPENOUT(VAR F:BYTEFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/O/N:9');BOPENOUT:=ERSTAT(F)MOD 8192=0;END;
FUNCTION TFMBOPENOUT(VAR F:BYTEFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/B:8/O');TFMBOPENOUT:=ERSTAT(F)MOD 8192=0;
END;FUNCTION WOPENIN(VAR F:WORDFILE):BOOLEAN;
BEGIN RESET(F,NAMEOFFILE,'/O/N:9');WOPENIN:=ERSTAT(F)MOD 8192=0;END;
FUNCTION WOPENOUT(VAR F:WORDFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/O/N:9');WOPENOUT:=ERSTAT(F)MOD 8192=0;END;
{:26}{27:}PROCEDURE ACLOSE(VAR F:ALPHAFILE);BEGIN CLOSE(F);END;
PROCEDURE BCLOSE(VAR F:BYTEFILE);BEGIN CLOSE(F);END;
PROCEDURE WCLOSE(VAR F:WORDFILE);BEGIN CLOSE(F);END;{:27}{30:}
FUNCTION INPUTLN(VAR F:ALPHAFILE;BYPASSEOLN:BOOLEAN):BOOLEAN;LABEL 1,30;
VAR N:INTEGER;K,M:0..BUFSIZE;
BEGIN IF BYPASSEOLN THEN BEGIN IF NOT EOF(F)THEN GET(F);
IF NOT EOF(F)THEN IF F↑=CHR(10)THEN GET(F);END;LAST:=FIRST;
IF EOF(F)THEN INPUTLN:=FALSE ELSE BEGIN READ(F,AUXBUF:N);
IF BUFFER[FIRST]=12 THEN BEGIN PAGE:=PAGE+1;LINE:=1;END;
1:IF LAST+N>MAXBUFSTACK THEN IF LAST+N>=BUFSIZE THEN BEGIN MAXBUFSTACK:=
BUFSIZE;OVERFLOW(128,BUFSIZE);END ELSE MAXBUFSTACK:=LAST+N;
IF N>0 THEN BEGIN M:=LAST;IF N=72 THEN LAST:=M+71 ELSE LAST:=M+N;
FOR K:=M TO LAST-1 DO BUFFER[K]:=XORD[AUXBUF[K-M]];
IF N=72 THEN BEGIN READ(F,AUXBUF:N);GOTO 1;END;
END ELSE IF F↑=CHR(12)THEN BEGIN AUXBUF[0]:=F↑;N:=1;GOTO 1;END;
WHILE TRUE DO BEGIN IF LAST=FIRST THEN GOTO 30;
IF BUFFER[LAST-1]<>32 THEN GOTO 30;LAST:=LAST-1;END;30:INPUTLN:=TRUE;
END;END;{:30}{36:}PROCEDURE ESCI(VAR X:INTEGER);EXTERN;
FUNCTION RESCAN:BOOLEAN;EXTERN;FUNCTION TMPIN(F:STRING;
VAR S:STRING):INTEGER;EXTERN;FUNCTION CCLSW:BOOLEAN;EXTERN;
PROCEDURE PTWR1W(PTY,C:INTEGER);EXTERN;FUNCTION INITTERMINAL:BOOLEAN;
LABEL 10;VAR L:INTEGER;LINEFOUND:BOOLEAN;
TMPCORBUF:PACKED ARRAY[0..100]OF CHAR;BEGIN;ESCI(INTERRUPT);LAST:=FIRST;
IF CCLSW THEN BEGIN L:=TMPIN('MF',TMPCORBUF);CURINPUT.LOCFIELD:=1;
WHILE(CURINPUT.LOCFIELD<L)AND(TMPCORBUF[CURINPUT.LOCFIELD]<>'←')DO
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
WHILE CURINPUT.LOCFIELD<L DO BEGIN IF TMPCORBUF[CURINPUT.LOCFIELD]>' '
THEN BEGIN BUFFER[LAST]:=XORD[TMPCORBUF[CURINPUT.LOCFIELD]];
LAST:=LAST+1;END;CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;
END ELSE IF FALSE THEN IF RESCAN THEN BEGIN READLN(TTY);
WHILE(NOT EOLN(TTY))AND(TTY↑<>';')DO GET(TTY);
IF TTY↑=';'THEN BEGIN GET(TTY);
WHILE NOT EOLN(TTY)DO BEGIN BUFFER[LAST]:=XORD[TTY↑];LAST:=LAST+1;
GET(TTY);END;END;END;LINEFOUND:=(LAST>FIRST);
WHILE TRUE DO BEGIN CURINPUT.LOCFIELD:=FIRST;
WHILE(CURINPUT.LOCFIELD<LAST)AND(BUFFER[CURINPUT.LOCFIELD]=32)DO
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
IF CURINPUT.LOCFIELD<LAST THEN BEGIN INITTERMINAL:=TRUE;GOTO 10;END;
IF LINEFOUND THEN WRITELN(TTY,'Please type the name of your input file.'
);WAKEUPTERMIN;WRITE(TTY,'**');BREAK(TTY);BUFFER[FIRST]:=0;
IF NOT INPUTLN(TTY,TRUE)THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! End of file on the terminal... why?');INITTERMINAL:=FALSE;
GOTO 10;END;LINEFOUND:=TRUE;END;10:END;{:36}{44:}
FUNCTION MAKESTRING:STRNUMBER;
BEGIN IF STRPTR=MAXSTRPTR THEN BEGIN IF STRPTR=MAXSTRINGS THEN OVERFLOW(
130,MAXSTRINGS-INITSTRPTR);MAXSTRPTR:=MAXSTRPTR+1;END;STRREF[STRPTR]:=1;
STRPTR:=STRPTR+1;STRSTART[STRPTR]:=POOLPTR;MAKESTRING:=STRPTR-1;END;
{:44}{45:}FUNCTION STREQBUF(S:STRNUMBER;K:INTEGER):BOOLEAN;LABEL 45;
VAR J:POOLPOINTER;RESULT:BOOLEAN;BEGIN J:=STRSTART[S];
WHILE J<STRSTART[S+1]DO BEGIN IF STRPOOL[J]<>BUFFER[K]THEN BEGIN RESULT
:=FALSE;GOTO 45;END;J:=J+1;K:=K+1;END;RESULT:=TRUE;45:STREQBUF:=RESULT;
END;{:45}{46:}FUNCTION STRVSSTR(S,T:STRNUMBER):INTEGER;LABEL 10;
VAR J,K:POOLPOINTER;LS,LT:INTEGER;L:INTEGER;
BEGIN LS:=(STRSTART[S+1]-STRSTART[S]);LT:=(STRSTART[T+1]-STRSTART[T]);
IF LS<=LT THEN L:=LS ELSE L:=LT;J:=STRSTART[S];K:=STRSTART[T];
WHILE L>0 DO BEGIN IF STRPOOL[J]<>STRPOOL[K]THEN BEGIN STRVSSTR:=STRPOOL
[J]-STRPOOL[K];GOTO 10;END;J:=J+1;K:=K+1;L:=L-1;END;STRVSSTR:=LS-LT;
10:END;{:46}{47:}FUNCTION GETSTRINGSST:BOOLEAN;LABEL 30,10;
VAR K,L:0..127;M,N:CHAR;G:STRNUMBER;A:INTEGER;C:BOOLEAN;
BEGIN POOLPTR:=0;STRPTR:=0;MAXPOOLPTR:=0;MAXSTRPTR:=0;STRSTART[0]:=0;
{48:}FOR K:=0 TO 127 DO BEGIN IF({49:}(K<32)OR(K>126){:49}
)THEN BEGIN BEGIN STRPOOL[POOLPTR]:=94;POOLPTR:=POOLPTR+1;END;
BEGIN STRPOOL[POOLPTR]:=94;POOLPTR:=POOLPTR+1;END;
IF K<64 THEN BEGIN STRPOOL[POOLPTR]:=K+64;POOLPTR:=POOLPTR+1;
END ELSE BEGIN STRPOOL[POOLPTR]:=K-64;POOLPTR:=POOLPTR+1;END;
END ELSE BEGIN STRPOOL[POOLPTR]:=K;POOLPTR:=POOLPTR+1;END;G:=MAKESTRING;
STRREF[G]:=127;END{:48};{51:}NAMEOFFILE:=POOLNAME;
IF AOPENIN(POOLFILE)THEN BEGIN C:=FALSE;REPEAT{52:}
BEGIN IF EOF(POOLFILE)THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL has no check sum.');ACLOSE(POOLFILE);
GETSTRINGSST:=FALSE;GOTO 10;END;READ(POOLFILE,M,N);IF M='*'THEN{53:}
BEGIN A:=0;K:=1;
WHILE TRUE DO BEGIN IF(XORD[N]<48)OR(XORD[N]>57)THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL check sum doesn''t have nine digits.');
ACLOSE(POOLFILE);GETSTRINGSST:=FALSE;GOTO 10;END;A:=10*A+XORD[N]-48;
IF K=9 THEN GOTO 30;K:=K+1;READ(POOLFILE,N);END;
30:IF A<>52045111 THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL doesn''t match; TANGLE me again.');
ACLOSE(POOLFILE);GETSTRINGSST:=FALSE;GOTO 10;END;C:=TRUE;END{:53}
ELSE BEGIN IF(XORD[M]<48)OR(XORD[M]>57)OR(XORD[N]<48)OR(XORD[N]>57)THEN
BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL line doesn''t begin with two digits.');
ACLOSE(POOLFILE);GETSTRINGSST:=FALSE;GOTO 10;END;
L:=XORD[M]*10+XORD[N]-48*11;
IF POOLPTR+L+STRINGVACANC>POOLSIZE THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! You have to increase POOLSIZE.');ACLOSE(POOLFILE);
GETSTRINGSST:=FALSE;GOTO 10;END;
FOR K:=1 TO L DO BEGIN IF EOLN(POOLFILE)THEN M:=' 'ELSE READ(POOLFILE,M)
;BEGIN STRPOOL[POOLPTR]:=XORD[M];POOLPTR:=POOLPTR+1;END;END;
READLN(POOLFILE);G:=MAKESTRING;STRREF[G]:=127;END;END{:52};UNTIL C;
ACLOSE(POOLFILE);GETSTRINGSST:=TRUE;END ELSE BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! I can''t read MF.POOL.');ACLOSE(POOLFILE);
GETSTRINGSST:=FALSE;GOTO 10;END{:51};10:END;{:47}{65:}
PROCEDURE PRINTDD(N:INTEGER);BEGIN N:=ABS(N)MOD 100;
PRINTCHAR(48+(N DIV 10));PRINTCHAR(48+(N MOD 10));END;{:65}{66:}
PROCEDURE TERMINPUT;VAR K:0..BUFSIZE;BEGIN BREAK(TTY);BUFFER[FIRST]:=0;
IF NOT INPUTLN(TTY,TRUE)THEN FATALERROR(132);TERMOFFSET:=0;
SELECTOR:=SELECTOR-1;
IF LAST<>FIRST THEN FOR K:=FIRST TO LAST-1 DO PRINT(BUFFER[K]);PRINTLN;
BUFFER[LAST]:=37;SELECTOR:=SELECTOR+1;END;{:66}{86:}
PROCEDURE NORMALIZESEL;
BEGIN IF JOBNAME>0 THEN SELECTOR:=3 ELSE SELECTOR:=1;
IF INTERACTION=0 THEN SELECTOR:=SELECTOR-1;
IF JOBNAME=0 THEN OPENLOGFILE;END;{:86}{92:}PROCEDURE PAUSEFORINST;
BEGIN IF OKTOINTERRUP THEN BEGIN INTERACTION:=3;
IF(SELECTOR=2)OR(SELECTOR=0)THEN SELECTOR:=SELECTOR+1;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(167);END;
BEGIN HELPPTR:=3;HELPLINE[2]:=168;HELPLINE[1]:=169;HELPLINE[0]:=170;END;
DELETIONSALL:=FALSE;ERROR;DELETIONSALL:=TRUE;INTERRUPT:=0;END;END;{:92}
{93:}PROCEDURE MISSINGERR(S:STRNUMBER);
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(171);
END;PRINT(S);PRINT(172);END;{:93}{98:}PROCEDURE CLEARARITH;
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(173);
END;BEGIN HELPPTR:=4;HELPLINE[3]:=174;HELPLINE[2]:=175;HELPLINE[1]:=176;
HELPLINE[0]:=177;END;ERROR;ARITHERROR:=FALSE;END;{:98}{99:}
FUNCTION SLOWADD(X,Y:INTEGER):INTEGER;
BEGIN IF X>=0 THEN IF Y<=2147483647-X THEN SLOWADD:=X+Y ELSE BEGIN
ARITHERROR:=TRUE;SLOWADD:=2147483647;
END ELSE IF-Y<=2147483647+X THEN SLOWADD:=X+Y ELSE BEGIN ARITHERROR:=
TRUE;SLOWADD:=-2147483647;END;END;{:99}{101:}
FUNCTION ROUNDDECIMAL(K:SMALLNUMBER):SCALED;VAR A:INTEGER;BEGIN A:=0;
WHILE K>0 DO BEGIN K:=K-1;A:=(A+DIG[K]*131072)DIV 10;END;
ROUNDDECIMAL:=(A+1)DIV 2;END;{:101}{106:}
FUNCTION MAKEFRACTION(P,Q:INTEGER):FRACTION;VAR F:INTEGER;N:INTEGER;
NEGATIVE:BOOLEAN;BECAREFUL:INTEGER;
BEGIN IF P>=0 THEN NEGATIVE:=FALSE ELSE BEGIN P:=-P;NEGATIVE:=TRUE;END;
IF Q<=0 THEN BEGIN IF Q=0 THEN CONFUSION(47);Q:=-Q;
NEGATIVE:=NOT NEGATIVE;END;N:=P DIV Q;P:=P MOD Q;
IF N>=8 THEN BEGIN ARITHERROR:=TRUE;
IF NEGATIVE THEN MAKEFRACTION:=-2147483647 ELSE MAKEFRACTION:=2147483647
;END ELSE BEGIN N:=(N-1)*268435456;{107:}F:=1;REPEAT BECAREFUL:=P-Q;
P:=BECAREFUL+P;IF P>=0 THEN F:=F+F+1 ELSE BEGIN F:=F+F;P:=P+Q;END;
UNTIL F>=268435456;BECAREFUL:=P-Q;IF BECAREFUL+P>=0 THEN F:=F+1{:107};
IF NEGATIVE THEN MAKEFRACTION:=-(F+N)ELSE MAKEFRACTION:=F+N;END;END;
{:106}{108:}FUNCTION TAKEFRACTION(Q:INTEGER;F:FRACTION):INTEGER;
VAR P:INTEGER;NEGATIVE:BOOLEAN;N:INTEGER;BECAREFUL:INTEGER;BEGIN{109:}
IF F>=0 THEN NEGATIVE:=FALSE ELSE BEGIN F:=-F;NEGATIVE:=TRUE;END;
IF Q<0 THEN BEGIN Q:=-Q;NEGATIVE:=NOT NEGATIVE;END;{:109};
IF F<268435456 THEN N:=0 ELSE BEGIN N:=F DIV 268435456;
F:=F MOD 268435456;
IF Q<=2147483647 DIV N THEN N:=N*Q ELSE BEGIN ARITHERROR:=TRUE;
N:=2147483647;END;END;F:=F+268435456;{110:}P:=134217728;
IF Q<1073741824 THEN REPEAT IF ODD(F)THEN P:=(P+Q)DIV 2 ELSE P:=(P)DIV 2
;F:=(F)DIV 2;
UNTIL F=1 ELSE REPEAT IF ODD(F)THEN P:=P+(Q-P)DIV 2 ELSE P:=(P)DIV 2;
F:=(F)DIV 2;UNTIL F=1{:110};BECAREFUL:=N-2147483647;
IF BECAREFUL+P>0 THEN BEGIN ARITHERROR:=TRUE;N:=2147483647-P;END;
IF NEGATIVE THEN TAKEFRACTION:=-(N+P)ELSE TAKEFRACTION:=N+P;END;{:108}
{111:}FUNCTION TAKESCALED(Q:INTEGER;F:SCALED):INTEGER;VAR P:INTEGER;
NEGATIVE:BOOLEAN;N:INTEGER;BECAREFUL:INTEGER;BEGIN{109:}
IF F>=0 THEN NEGATIVE:=FALSE ELSE BEGIN F:=-F;NEGATIVE:=TRUE;END;
IF Q<0 THEN BEGIN Q:=-Q;NEGATIVE:=NOT NEGATIVE;END;{:109};
IF F<65536 THEN N:=0 ELSE BEGIN N:=F DIV 65536;F:=F MOD 65536;
IF Q<=2147483647 DIV N THEN N:=N*Q ELSE BEGIN ARITHERROR:=TRUE;
N:=2147483647;END;END;F:=F+65536;{112:}P:=32768;
IF Q<1073741824 THEN REPEAT IF ODD(F)THEN P:=(P+Q)DIV 2 ELSE P:=(P)DIV 2
;F:=(F)DIV 2;
UNTIL F=1 ELSE REPEAT IF ODD(F)THEN P:=P+(Q-P)DIV 2 ELSE P:=(P)DIV 2;
F:=(F)DIV 2;UNTIL F=1{:112};BECAREFUL:=N-2147483647;
IF BECAREFUL+P>0 THEN BEGIN ARITHERROR:=TRUE;N:=2147483647-P;END;
IF NEGATIVE THEN TAKESCALED:=-(N+P)ELSE TAKESCALED:=N+P;END;{:111}{113:}
FUNCTION MAKESCALED(P,Q:INTEGER):SCALED;VAR F:INTEGER;N:INTEGER;
NEGATIVE:BOOLEAN;BECAREFUL:INTEGER;
BEGIN IF P>=0 THEN NEGATIVE:=FALSE ELSE BEGIN P:=-P;NEGATIVE:=TRUE;END;
IF Q<=0 THEN BEGIN IF Q=0 THEN CONFUSION(47);Q:=-Q;
NEGATIVE:=NOT NEGATIVE;END;N:=P DIV Q;P:=P MOD Q;
IF N>=32768 THEN BEGIN ARITHERROR:=TRUE;
IF NEGATIVE THEN MAKESCALED:=-2147483647 ELSE MAKESCALED:=2147483647;
END ELSE BEGIN N:=(N-1)*65536;{114:}F:=1;REPEAT BECAREFUL:=P-Q;
P:=BECAREFUL+P;IF P>=0 THEN F:=F+F+1 ELSE BEGIN F:=F+F;P:=P+Q;END;
UNTIL F>=65536;BECAREFUL:=P-Q;IF BECAREFUL+P>=0 THEN F:=F+1{:114};
IF NEGATIVE THEN MAKESCALED:=-(F+N)ELSE MAKESCALED:=F+N;END;END;{:113}
{115:}FUNCTION VELOCITY(ST,CT,SF,CF:FRACTION;T:SCALED):FRACTION;
VAR ACC,NUM,DENOM:INTEGER;
BEGIN ACC:=TAKEFRACTION(ST-(SF DIV 16),SF-(ST DIV 16));
ACC:=TAKEFRACTION(ACC,CT-CF);NUM:=536870912+TAKEFRACTION(ACC,379625062);
DENOM:=805306368+TAKEFRACTION(CT,497706707)+TAKEFRACTION(CF,307599661);
IF T<>65536 THEN NUM:=MAKESCALED(NUM,T);
IF NUM DIV 4>=DENOM THEN VELOCITY:=1073741824 ELSE VELOCITY:=
MAKEFRACTION(NUM,DENOM);END;{:115}{116:}
FUNCTION ABVSCD(A,B,C,D:INTEGER):INTEGER;LABEL 10;VAR Q,R:INTEGER;
BEGIN{117:}IF A<0 THEN BEGIN A:=-A;B:=-B;END;IF C<0 THEN BEGIN C:=-C;
D:=-D;END;
IF D<=0 THEN BEGIN IF B>=0 THEN IF((A=0)OR(B=0))AND((C=0)OR(D=0))THEN
BEGIN ABVSCD:=0;GOTO 10;END ELSE BEGIN ABVSCD:=1;GOTO 10;END;
IF D=0 THEN IF A=0 THEN BEGIN ABVSCD:=0;GOTO 10;
END ELSE BEGIN ABVSCD:=-1;GOTO 10;END;Q:=A;A:=C;C:=Q;Q:=-B;B:=-D;D:=Q;
END ELSE IF B<=0 THEN BEGIN IF B<0 THEN IF A>0 THEN BEGIN ABVSCD:=-1;
GOTO 10;END;IF C=0 THEN BEGIN ABVSCD:=0;GOTO 10;
END ELSE BEGIN ABVSCD:=-1;GOTO 10;END;END{:117};
WHILE TRUE DO BEGIN Q:=A DIV D;R:=C DIV B;
IF Q<>R THEN IF Q>R THEN BEGIN ABVSCD:=1;GOTO 10;
END ELSE BEGIN ABVSCD:=-1;GOTO 10;END;Q:=A MOD D;R:=C MOD B;
IF R=0 THEN IF Q=0 THEN BEGIN ABVSCD:=0;GOTO 10;
END ELSE BEGIN ABVSCD:=1;GOTO 10;END;IF Q=0 THEN BEGIN ABVSCD:=-1;
GOTO 10;END;A:=B;B:=Q;C:=D;D:=R;END;10:END;{:116}{118:}
FUNCTION FLOORSCALED(X:SCALED):SCALED;VAR BECAREFUL:INTEGER;
BEGIN IF X>=0 THEN FLOORSCALED:=X-(X MOD 65536)ELSE BEGIN BECAREFUL:=X+1
;FLOORSCALED:=X+((-BECAREFUL)MOD 65536)-65535;END;END;
FUNCTION FLOORUNSCALE(X:SCALED):INTEGER;VAR BECAREFUL:INTEGER;
BEGIN IF X>=0 THEN FLOORUNSCALE:=X DIV 65536 ELSE BEGIN BECAREFUL:=X+1;
FLOORUNSCALE:=-(1+((-BECAREFUL)DIV 65536));END;END;
FUNCTION ROUNDUNSCALE(X:SCALED):INTEGER;VAR BECAREFUL:INTEGER;
BEGIN IF X>=32768 THEN ROUNDUNSCALE:=1+((X-32768)DIV 65536)ELSE IF X>=
-32768 THEN ROUNDUNSCALE:=0 ELSE BEGIN BECAREFUL:=X+1;
ROUNDUNSCALE:=-(1+((-BECAREFUL-32768)DIV 65536));END;END;
FUNCTION ROUNDFRACTIO(X:FRACTION):SCALED;VAR BECAREFUL:INTEGER;
BEGIN IF X>=2048 THEN ROUNDFRACTIO:=1+((X-2048)DIV 4096)ELSE IF X>=-2048
THEN ROUNDFRACTIO:=0 ELSE BEGIN BECAREFUL:=X+1;
ROUNDFRACTIO:=-(1+((-BECAREFUL-2048)DIV 4096));END;END;{:118}{120:}
FUNCTION SQUARERT(X:SCALED):SCALED;VAR K:SMALLNUMBER;Y,Q:INTEGER;
BEGIN IF X<=0 THEN{121:}
BEGIN IF X<0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(178);END;PRINTSCALED(X);PRINT(179);BEGIN HELPPTR:=2;
HELPLINE[1]:=180;HELPLINE[0]:=181;END;ERROR;END;SQUARERT:=0;END{:121}
ELSE BEGIN K:=23;Q:=2;WHILE X<536870912 DO BEGIN K:=K-1;X:=X+X+X+X;END;
IF X<1073741824 THEN Y:=0 ELSE BEGIN X:=X-1073741824;Y:=1;END;
REPEAT{122:}X:=X+X;Y:=Y+Y;IF X>=1073741824 THEN BEGIN X:=X-1073741824;
Y:=Y+1;END;X:=X+X;Y:=Y+Y-Q;Q:=Q+Q;
IF X>=1073741824 THEN BEGIN X:=X-1073741824;Y:=Y+1;END;
IF Y>Q THEN BEGIN Y:=Y-Q;Q:=Q+2;END ELSE IF Y<=0 THEN BEGIN Q:=Q-2;
Y:=Y+Q;END;K:=K-1{:122};UNTIL K=0;SQUARERT:=(Q)DIV 2;END;END;{:120}
{123:}FUNCTION PYTHADD(A,B:INTEGER):INTEGER;LABEL 30;VAR R:FRACTION;
BIG:BOOLEAN;BEGIN A:=ABS(A);B:=ABS(B);IF A<B THEN BEGIN R:=B;B:=A;A:=R;
END;
IF A>0 THEN BEGIN IF A<536870912 THEN BIG:=FALSE ELSE BEGIN A:=A DIV 4;
B:=B DIV 4;BIG:=TRUE;END;{124:}WHILE TRUE DO BEGIN R:=MAKEFRACTION(B,A);
R:=TAKEFRACTION(R,R);IF R=0 THEN GOTO 30;
R:=MAKEFRACTION(R,1073741824+R);A:=A+TAKEFRACTION(A+A,R);
B:=TAKEFRACTION(B,R);END;30:{:124};
IF BIG THEN IF A<536870912 THEN A:=A+A+A+A ELSE BEGIN ARITHERROR:=TRUE;
A:=2147483647;END;END;PYTHADD:=A;END;{:123}{125:}
FUNCTION PYTHSUB(A,B:INTEGER):INTEGER;LABEL 30;VAR R:FRACTION;
BIG:BOOLEAN;BEGIN A:=ABS(A);B:=ABS(B);IF A<=B THEN{127:}
BEGIN IF A<B THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(182);END;PRINTSCALED(A);PRINT(183);PRINTSCALED(B);
PRINT(179);BEGIN HELPPTR:=2;HELPLINE[1]:=180;HELPLINE[0]:=181;END;ERROR;
END;A:=0;END{:127}
ELSE BEGIN IF A<1073741824 THEN BIG:=FALSE ELSE BEGIN A:=(A)DIV 2;
B:=(B)DIV 2;BIG:=TRUE;END;{126:}
WHILE TRUE DO BEGIN R:=MAKEFRACTION(B,A);R:=TAKEFRACTION(R,R);
IF R=0 THEN GOTO 30;R:=MAKEFRACTION(R,1073741824-R);
A:=A-TAKEFRACTION(A+A,R);B:=TAKEFRACTION(B,R);END;30:{:126};
IF BIG THEN A:=A+A;END;PYTHSUB:=A;END;{:125}{131:}
FUNCTION MLOG(X:SCALED):SCALED;VAR Y,Z:INTEGER;K:INTEGER;
BEGIN IF X<=0 THEN{133:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(184);END;PRINTSCALED(X);PRINT(179);BEGIN HELPPTR:=2;
HELPLINE[1]:=185;HELPLINE[0]:=181;END;ERROR;MLOG:=0;END{:133}
ELSE BEGIN Y:=1302456860;Z:=6581195;WHILE X<1073741824 DO BEGIN X:=X+X;
Y:=Y-93032639;Z:=Z-48782;END;Y:=Y+(Z DIV 65536);K:=2;
WHILE X>1073741828 DO{132:}BEGIN Z:=((X-1)DIV TWOTOTHE[K])+1;
WHILE X<1073741824+Z DO BEGIN Z:=(Z+1)DIV 2;K:=K+1;END;Y:=Y+SPECLOG[K];
X:=X-Z;END{:132};MLOG:=Y DIV 8;END;END;{:131}{134:}
FUNCTION MEXP(X:SCALED):SCALED;VAR K:SMALLNUMBER;Y,Z:INTEGER;
BEGIN IF X>174436200 THEN BEGIN ARITHERROR:=TRUE;MEXP:=2147483647;
END ELSE IF X<-197694359 THEN MEXP:=0 ELSE BEGIN IF X<=0 THEN BEGIN Z:=
-8*X;Y:=1048576;
END ELSE BEGIN IF X<=127919879 THEN Z:=1023359037-8*X ELSE Z:=8*(
174436200-X);Y:=2147483647;END;{135:}K:=1;
WHILE Z>0 DO BEGIN WHILE Z>=SPECLOG[K]DO BEGIN Z:=Z-SPECLOG[K];
Y:=Y-1-((Y-TWOTOTHE[K-1])DIV TWOTOTHE[K]);END;K:=K+1;END{:135};
IF X<=127919879 THEN MEXP:=(Y+8)DIV 16 ELSE MEXP:=Y;END;END;{:134}{138:}
FUNCTION NARG(X,Y:INTEGER):ANGLE;VAR Z:ANGLE;T:INTEGER;K:SMALLNUMBER;
OCTANT:1..8;BEGIN IF X>=0 THEN OCTANT:=1 ELSE BEGIN X:=-X;OCTANT:=2;END;
IF Y<0 THEN BEGIN Y:=-Y;OCTANT:=OCTANT+2;END;IF X<Y THEN BEGIN T:=Y;
Y:=X;X:=T;OCTANT:=OCTANT+4;END;IF X=0 THEN{139:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(186);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=187;HELPLINE[0]:=181;END;ERROR;
NARG:=0;END{:139}ELSE BEGIN{141:}
WHILE X>=536870912 DO BEGIN X:=(X)DIV 2;Y:=(Y)DIV 2;END;Z:=0;
IF Y>0 THEN BEGIN WHILE X<268435456 DO BEGIN X:=X+X;Y:=Y+Y;END;{142:}
K:=0;REPEAT Y:=Y+Y;K:=K+1;IF Y>X THEN BEGIN Z:=Z+SPECATAN[K];T:=X;
X:=X+(Y DIV TWOTOTHE[K+K]);Y:=Y-T;END;UNTIL K=15;REPEAT Y:=Y+Y;K:=K+1;
IF Y>X THEN BEGIN Z:=Z+SPECATAN[K];Y:=Y-X;END;UNTIL K=26{:142};END{:141}
;{140:}CASE OCTANT OF 1:NARG:=Z;5:NARG:=94371840-Z;6:NARG:=94371840+Z;
2:NARG:=188743680-Z;4:NARG:=Z-188743680;8:NARG:=-Z-94371840;
7:NARG:=Z-94371840;3:NARG:=-Z;END{:140};END;END;{:138}{144:}
PROCEDURE NSINCOS(Z:ANGLE);VAR K:SMALLNUMBER;Q:0..7;R:FRACTION;
X,Y,T:INTEGER;BEGIN WHILE Z<0 DO Z:=Z+377487360;Z:=Z MOD 377487360;
Q:=Z DIV 47185920;Z:=Z MOD 47185920;X:=268435456;Y:=X;
IF NOT ODD(Q)THEN Z:=47185920-Z;{146:}K:=1;
WHILE Z>0 DO BEGIN IF Z>=SPECATAN[K]THEN BEGIN Z:=Z-SPECATAN[K];T:=X;
X:=T+Y DIV TWOTOTHE[K];Y:=Y-T DIV TWOTOTHE[K];END;K:=K+1;END;
IF Y<0 THEN Y:=0{:146};{145:}CASE Q OF 0:;1:BEGIN T:=X;X:=Y;Y:=T;END;
2:BEGIN T:=X;X:=-Y;Y:=T;END;3:X:=-X;4:BEGIN X:=-X;Y:=-Y;END;
5:BEGIN T:=X;X:=-Y;Y:=-T;END;6:BEGIN T:=X;X:=Y;Y:=-T;END;7:Y:=-Y;
END{:145};R:=PYTHADD(X,Y);NCOS:=MAKEFRACTION(X,R);
NSIN:=MAKEFRACTION(Y,R);END;{:144}{148:}PROCEDURE NEWRANDOMS;
VAR K:0..54;X:FRACTION;
BEGIN FOR K:=0 TO 23 DO BEGIN X:=RANDOMS[K]-RANDOMS[K+31];
IF X<0 THEN X:=X+268435456;RANDOMS[K]:=X;END;
FOR K:=24 TO 54 DO BEGIN X:=RANDOMS[K]-RANDOMS[K-24];
IF X<0 THEN X:=X+268435456;RANDOMS[K]:=X;END;JRANDOM:=54;END;{:148}
{149:}PROCEDURE INITRANDOMS(SEED:SCALED);VAR J,JJ,K:FRACTION;I:0..54;
BEGIN J:=ABS(SEED);WHILE J>=268435456 DO J:=(J)DIV 2;K:=1;
FOR I:=0 TO 54 DO BEGIN JJ:=K;K:=J-K;J:=JJ;IF K<0 THEN K:=K+268435456;
RANDOMS[(I*21)MOD 55]:=J;END;NEWRANDOMS;NEWRANDOMS;NEWRANDOMS;END;{:149}
{150:}FUNCTION UNIFRAND(X:SCALED):SCALED;VAR Y:SCALED;
BEGIN IF X<=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(188);END;PRINTSCALED(X);PRINT(179);BEGIN HELPPTR:=2;
HELPLINE[1]:=189;HELPLINE[0]:=181;END;ERROR;UNIFRAND:=0;
END ELSE BEGIN IF JRANDOM=0 THEN NEWRANDOMS ELSE JRANDOM:=JRANDOM-1;
Y:=TAKEFRACTION(X,RANDOMS[JRANDOM]);
IF Y=X THEN UNIFRAND:=0 ELSE UNIFRAND:=Y;END;END;{:150}{151:}
FUNCTION NORMRAND:SCALED;VAR X,U,L:INTEGER;
BEGIN REPEAT REPEAT IF JRANDOM=0 THEN NEWRANDOMS ELSE JRANDOM:=JRANDOM-1
;X:=TAKEFRACTION(112429,RANDOMS[JRANDOM]-134217728);
IF JRANDOM=0 THEN NEWRANDOMS ELSE JRANDOM:=JRANDOM-1;
U:=RANDOMS[JRANDOM];UNTIL ABS(X)<U;X:=MAKEFRACTION(X,U);
L:=139548960-MLOG(U);UNTIL ABVSCD(1024,L,X,X)>=0;NORMRAND:=X;END;{:151}
{156:}PROCEDURE PRINTWORD(W:MEMORYWORD);BEGIN PRINTINT(W.INT);
PRINTCHAR(32);PRINTSCALED(W.INT);PRINTCHAR(32);
PRINTSCALED(W.INT DIV 4096);PRINTLN;PRINTINT(W.HH.LH);PRINTCHAR(61);
PRINTINT(W.HH.B0);PRINTCHAR(58);PRINTINT(W.HH.B1);PRINTCHAR(59);
PRINTINT(W.HH.RH);PRINTCHAR(32);PRINTINT(W.QQQQ.B0);PRINTCHAR(58);
PRINTINT(W.QQQQ.B1);PRINTCHAR(58);PRINTINT(W.QQQQ.B2);PRINTCHAR(58);
PRINTINT(W.QQQQ.B3);END;{:156}{161:}{216:}PROCEDURE PRINTCAPSULE;
FORWARD;PROCEDURE SHOWTOKENLIS(P,Q:INTEGER;L:INTEGER);LABEL 10;
VAR CLASS,C:SMALLNUMBER;R,V:INTEGER;BEGIN CLASS:=3;
IF L<2147483647 THEN TALLY:=0;
WHILE(P<>0)AND(TALLY<L)DO BEGIN IF P=Q THEN{631:}
BEGIN FIRSTCOUNT:=TALLY;TRICKCOUNT:=TALLY+1+ERRORLINE-HALFERRORLIN;
IF TRICKCOUNT<ERRORLINE THEN TRICKCOUNT:=ERRORLINE;END{:631};{217:}C:=9;
IF(P<0)OR(P>MEMEND)THEN BEGIN PRINT(362);GOTO 10;END;
IF P<HIMEMMIN THEN{218:}
IF MEM[P].HH.B1=12 THEN IF MEM[P].HH.B0=15 THEN{219:}
BEGIN IF CLASS=0 THEN PRINTCHAR(32);V:=MEM[P+1].INT;
IF V<0 THEN BEGIN IF CLASS=17 THEN PRINTCHAR(32);PRINTCHAR(91);
PRINTSCALED(V);PRINTCHAR(93);C:=18;END ELSE BEGIN PRINTSCALED(V);C:=0;
END;END{:219}
ELSE IF MEM[P].HH.B0<>4 THEN PRINT(365)ELSE BEGIN PRINTCHAR(34);
SLOWPRINT(MEM[P+1].INT);PRINTCHAR(34);C:=4;
END ELSE IF(MEM[P].HH.B1<>11)OR(MEM[P].HH.B0<1)OR(MEM[P].HH.B0>19)THEN
PRINT(365)ELSE BEGIN GPOINTER:=P;PRINTCAPSULE;C:=8;END{:218}
ELSE BEGIN R:=MEM[P].HH.LH;IF R>=2243 THEN{221:}
BEGIN IF R<2393 THEN BEGIN PRINT(367);R:=R-(2243);
END ELSE IF R<2543 THEN BEGIN PRINT(368);R:=R-(2393);
END ELSE BEGIN PRINT(369);R:=R-(2543);END;PRINTINT(R);PRINTCHAR(41);
C:=8;END{:221}ELSE IF R<1 THEN IF R=0 THEN{220:}
BEGIN IF CLASS=17 THEN PRINTCHAR(32);PRINT(366);C:=18;END{:220}
ELSE PRINT(363)ELSE BEGIN R:=HASH[R].RH;
IF(R<0)OR(R>=STRPTR)THEN PRINT(364)ELSE{222:}
BEGIN C:=CHARCLASS[STRPOOL[STRSTART[R]]];
IF C=CLASS THEN CASE C OF 9:PRINTCHAR(46);5,6,7,8:;
OTHERS:PRINTCHAR(32)END;PRINT(R);END{:222};END;END{:217};CLASS:=C;
P:=MEM[P].HH.RH;END;IF P<>0 THEN PRINT(361);10:END;{:216}{650:}
PROCEDURE RUNAWAY;BEGIN IF SCANNERSTATU>2 THEN BEGIN PRINTNL(500);
CASE SCANNERSTATU OF 3:PRINT(501);4,5:PRINT(502);6:PRINT(503);END;
PRINTLN;SHOWTOKENLIS(MEM[2999].HH.RH,0,ERRORLINE-10);END;END;{:650}
{:161}{162:}FUNCTION GETAVAIL:HALFWORD;VAR P:HALFWORD;BEGIN P:=AVAIL;
IF P<>0 THEN AVAIL:=MEM[AVAIL].HH.RH ELSE IF MEMEND<MEMMAX THEN BEGIN
MEMEND:=MEMEND+1;P:=MEMEND;END ELSE BEGIN HIMEMMIN:=HIMEMMIN-1;
P:=HIMEMMIN;IF HIMEMMIN<=LOMEMMAX THEN BEGIN RUNAWAY;
OVERFLOW(190,MEMMAX+1);END;END;MEM[P].HH.RH:=0;DYNUSED:=DYNUSED+1;
GETAVAIL:=P;END;{:162}{166:}FUNCTION GETNODE(S:INTEGER):HALFWORD;
LABEL 40,10,20;VAR P:HALFWORD;Q:HALFWORD;R:INTEGER;T:INTEGER;
BEGIN 20:P:=ROVER;REPEAT{168:}Q:=P+MEM[P].HH.LH;
WHILE(MEM[Q].HH.RH=65535)DO BEGIN T:=MEM[Q+1].HH.RH;
IF Q=ROVER THEN ROVER:=T;MEM[T+1].HH.LH:=MEM[Q+1].HH.LH;
MEM[MEM[Q+1].HH.LH+1].HH.RH:=T;Q:=Q+MEM[Q].HH.LH;END;R:=Q-S;
IF R>P+1 THEN{169:}BEGIN MEM[P].HH.LH:=R-P;ROVER:=P;GOTO 40;END{:169};
IF R=P THEN IF((MEM[P+1].HH.RH<>ROVER)OR(MEM[P+1].HH.LH<>ROVER))THEN{170
:}BEGIN ROVER:=MEM[P+1].HH.RH;T:=MEM[P+1].HH.LH;MEM[ROVER+1].HH.LH:=T;
MEM[T+1].HH.RH:=ROVER;GOTO 40;END{:170};MEM[P].HH.LH:=Q-P{:168};
P:=MEM[P+1].HH.RH;UNTIL P=ROVER;
IF S=1073741824 THEN BEGIN GETNODE:=65535;GOTO 10;END;
IF LOMEMMAX+2<HIMEMMIN THEN IF LOMEMMAX+2<=65535 THEN{167:}
BEGIN IF LOMEMMAX+1000<HIMEMMIN THEN T:=LOMEMMAX+1000 ELSE T:=(LOMEMMAX+
HIMEMMIN+2)DIV 2;IF T>65535 THEN T:=65535;P:=MEM[ROVER+1].HH.LH;
Q:=LOMEMMAX;MEM[P+1].HH.RH:=Q;MEM[ROVER+1].HH.LH:=Q;
MEM[Q+1].HH.RH:=ROVER;MEM[Q+1].HH.LH:=P;MEM[Q].HH.RH:=65535;
MEM[Q].HH.LH:=T-LOMEMMAX;LOMEMMAX:=T;MEM[LOMEMMAX].HH.RH:=0;
MEM[LOMEMMAX].HH.LH:=0;ROVER:=Q;GOTO 20;END{:167};
OVERFLOW(190,MEMMAX+1);40:MEM[R].HH.RH:=0;VARUSED:=VARUSED+S;GETNODE:=R;
10:END;{:166}{171:}PROCEDURE FREENODE(P:HALFWORD;S:HALFWORD);
VAR Q:HALFWORD;BEGIN MEM[P].HH.LH:=S;MEM[P].HH.RH:=65535;
Q:=MEM[ROVER+1].HH.LH;MEM[P+1].HH.LH:=Q;MEM[P+1].HH.RH:=ROVER;
MEM[ROVER+1].HH.LH:=P;MEM[Q+1].HH.RH:=P;VARUSED:=VARUSED-S;END;{:171}
{172:}PROCEDURE SORTAVAIL;VAR P,Q,R:HALFWORD;OLDROVER:HALFWORD;
BEGIN P:=GETNODE(1073741824);P:=MEM[ROVER+1].HH.RH;
MEM[ROVER+1].HH.RH:=65535;OLDROVER:=ROVER;WHILE P<>OLDROVER DO{173:}
IF P<ROVER THEN BEGIN Q:=P;P:=MEM[Q+1].HH.RH;MEM[Q+1].HH.RH:=ROVER;
ROVER:=Q;END ELSE BEGIN Q:=ROVER;
WHILE MEM[Q+1].HH.RH<P DO Q:=MEM[Q+1].HH.RH;R:=MEM[P+1].HH.RH;
MEM[P+1].HH.RH:=MEM[Q+1].HH.RH;MEM[Q+1].HH.RH:=P;P:=R;END{:173};
P:=ROVER;
WHILE MEM[P+1].HH.RH<>65535 DO BEGIN MEM[MEM[P+1].HH.RH+1].HH.LH:=P;
P:=MEM[P+1].HH.RH;END;MEM[P+1].HH.RH:=ROVER;MEM[ROVER+1].HH.LH:=P;END;
{:172}{176:}PROCEDURE FLUSHLIST(P:HALFWORD);LABEL 10;VAR Q:HALFWORD;
BEGIN WHILE P>=HIMEMMIN DO BEGIN IF P=3000 THEN GOTO 10;Q:=MEM[P].HH.RH;
BEGIN MEM[P].HH.RH:=AVAIL;AVAIL:=P;DYNUSED:=DYNUSED-1;END;P:=Q;END;
10:END;PROCEDURE FLUSHNODELIS(P:HALFWORD);VAR Q:HALFWORD;
BEGIN WHILE P<>0 DO BEGIN Q:=P;P:=MEM[P].HH.RH;
IF Q<HIMEMMIN THEN FREENODE(Q,2)ELSE BEGIN MEM[Q].HH.RH:=AVAIL;AVAIL:=Q;
DYNUSED:=DYNUSED-1;END;END;END;{:176}{179:}
PROCEDURE CHECKMEM(PRINTLOCS:BOOLEAN);LABEL 31,32;VAR P,Q,R:HALFWORD;
CLOBBERED:BOOLEAN;BEGIN FOR P:=0 TO LOMEMMAX DO FREE[P]:=FALSE;
FOR P:=HIMEMMIN TO MEMEND DO FREE[P]:=FALSE;{180:}P:=AVAIL;Q:=0;
CLOBBERED:=FALSE;
WHILE P<>0 DO BEGIN IF(P>MEMEND)OR(P<HIMEMMIN)THEN CLOBBERED:=TRUE ELSE
IF FREE[P]THEN CLOBBERED:=TRUE;IF CLOBBERED THEN BEGIN PRINTNL(191);
PRINTINT(Q);GOTO 31;END;FREE[P]:=TRUE;Q:=P;P:=MEM[Q].HH.RH;END;31:{:180}
;{181:}P:=ROVER;Q:=0;CLOBBERED:=FALSE;
REPEAT IF(P>=LOMEMMAX)OR(P<0)THEN CLOBBERED:=TRUE ELSE IF(MEM[P+1].HH.RH
>=LOMEMMAX)OR(MEM[P+1].HH.RH<0)THEN CLOBBERED:=TRUE ELSE IF NOT((MEM[P].
HH.RH=65535))OR(MEM[P].HH.LH<2)OR(P+MEM[P].HH.LH>LOMEMMAX)OR(MEM[MEM[P+1
].HH.RH+1].HH.LH<>P)THEN CLOBBERED:=TRUE;
IF CLOBBERED THEN BEGIN PRINTNL(192);PRINTINT(Q);GOTO 32;END;
FOR Q:=P TO P+MEM[P].HH.LH-1 DO BEGIN IF FREE[Q]THEN BEGIN PRINTNL(193);
PRINTINT(Q);GOTO 32;END;FREE[Q]:=TRUE;END;Q:=P;P:=MEM[P+1].HH.RH;
UNTIL P=ROVER;32:{:181};{182:}P:=0;
WHILE P<=LOMEMMAX DO BEGIN IF(MEM[P].HH.RH=65535)THEN BEGIN PRINTNL(194)
;PRINTINT(P);END;WHILE(P<=LOMEMMAX)AND NOT FREE[P]DO P:=P+1;
WHILE(P<=LOMEMMAX)AND FREE[P]DO P:=P+1;END{:182};{602:}Q:=13;
P:=MEM[Q].HH.RH;
WHILE P<>13 DO BEGIN IF MEM[P+1].HH.LH<>Q THEN BEGIN PRINTNL(458);
PRINTINT(P);END;P:=MEM[P+1].HH.RH;R:=HIMEMMIN;
REPEAT IF MEM[P].HH.LH>=R THEN BEGIN PRINTNL(459);PRINTINT(P);END;
R:=MEM[P].HH.LH;Q:=P;P:=MEM[Q].HH.RH;UNTIL R=0;END{:602};
IF PRINTLOCS THEN{183:}BEGIN PRINTNL(195);
FOR P:=0 TO LOMEMMAX DO IF NOT FREE[P]AND((P>WASLOMAX)OR WASFREE[P])THEN
BEGIN PRINTCHAR(32);PRINTINT(P);END;
FOR P:=HIMEMMIN TO MEMEND DO IF NOT FREE[P]AND((P<WASHIMIN)OR(P>
WASMEMEND)OR WASFREE[P])THEN BEGIN PRINTCHAR(32);PRINTINT(P);END;
END{:183};FOR P:=0 TO LOMEMMAX DO WASFREE[P]:=FREE[P];
FOR P:=HIMEMMIN TO MEMEND DO WASFREE[P]:=FREE[P];WASMEMEND:=MEMEND;
WASLOMAX:=LOMEMMAX;WASHIMIN:=HIMEMMIN;END;{:179}{184:}
PROCEDURE SEARCHMEM(P:HALFWORD);VAR Q:INTEGER;
BEGIN FOR Q:=0 TO LOMEMMAX DO BEGIN IF MEM[Q].HH.RH=P THEN BEGIN PRINTNL
(196);PRINTINT(Q);PRINTCHAR(41);END;
IF MEM[Q].HH.LH=P THEN BEGIN PRINTNL(197);PRINTINT(Q);PRINTCHAR(41);END;
END;
FOR Q:=HIMEMMIN TO MEMEND DO BEGIN IF MEM[Q].HH.RH=P THEN BEGIN PRINTNL(
196);PRINTINT(Q);PRINTCHAR(41);END;
IF MEM[Q].HH.LH=P THEN BEGIN PRINTNL(197);PRINTINT(Q);PRINTCHAR(41);END;
END;{208:}
FOR Q:=1 TO 2242 DO BEGIN IF EQTB[Q].RH=P THEN BEGIN PRINTNL(331);
PRINTINT(Q);PRINTCHAR(41);END;END{:208};END;{:184}{188:}
PROCEDURE PRINTOP(C:QUARTERWORD);
BEGIN IF C<=18 THEN PRINTTYPE(C)ELSE CASE C OF 30:PRINT(222);
31:PRINT(223);32:PRINT(224);33:PRINT(225);34:PRINT(226);35:PRINT(227);
36:PRINT(228);37:PRINT(229);38:PRINT(230);39:PRINT(231);40:PRINT(232);
41:PRINT(233);42:PRINT(234);43:PRINT(235);44:PRINT(236);45:PRINT(237);
46:PRINT(238);47:PRINT(239);48:PRINT(240);49:PRINT(241);50:PRINT(242);
51:PRINT(243);52:PRINT(244);53:PRINT(245);54:PRINT(246);55:PRINT(247);
56:PRINT(248);57:PRINT(249);58:PRINT(250);59:PRINT(251);60:PRINT(252);
61:PRINT(253);62:PRINT(254);63:PRINT(255);64:PRINT(256);65:PRINT(257);
66:PRINT(258);67:PRINT(259);68:PRINT(260);69:PRINTCHAR(43);
70:PRINTCHAR(45);71:PRINTCHAR(42);72:PRINTCHAR(47);73:PRINT(261);
74:PRINT(183);75:PRINT(262);76:PRINT(263);77:PRINTCHAR(60);
78:PRINT(264);79:PRINTCHAR(62);80:PRINT(265);81:PRINTCHAR(61);
82:PRINT(266);94:PRINT(267);95:PRINT(268);96:PRINT(269);97:PRINT(270);
98:PRINT(271);99:PRINT(272);100:PRINT(273);83:PRINT(38);84:PRINT(274);
85:PRINT(275);86:PRINT(276);87:PRINT(277);88:PRINT(278);89:PRINT(279);
90:PRINT(280);91:PRINT(281);92:PRINT(282);OTHERS:PRINT(283)END;END;
{:188}{193:}PROCEDURE FIXDATEANDTI;VAR T:INTEGER;DATE:INTEGER;G:BOOLEAN;
BEGIN CALLI(131137,,T,T,G);DATE:=T DIV 262144;
INTERNAL[16]:=((T MOD 262144)DIV 60)*65536;
INTERNAL[15]:=((DATE MOD 31)+1)*65536;
INTERNAL[14]:=(((DATE DIV 31)MOD 12)+1)*65536;
INTERNAL[13]:=((DATE DIV(31*12))+1964)*65536;
IF INTERNAL[14]=262144 THEN IF INTERNAL[15]=65536 THEN WRITELN(TTY,
'Hello! I am your user-friendly MF System.');END;{:193}{204:}
FUNCTION IDLOOKUP(J,L:INTEGER):HALFWORD;LABEL 40;VAR H:INTEGER;
P:HALFWORD;K:HALFWORD;BEGIN IF L=1 THEN{205:}BEGIN P:=BUFFER[J]+1;
HASH[P].RH:=P-1;GOTO 40;END{:205};{207:}H:=BUFFER[J];
FOR K:=J+1 TO J+L-1 DO BEGIN H:=H+H+BUFFER[K];
WHILE H>=1777 DO H:=H-1777;END{:207};P:=H+129;
WHILE TRUE DO BEGIN IF HASH[P].RH>0 THEN IF(STRSTART[HASH[P].RH+1]-
STRSTART[HASH[P].RH])=L THEN IF STREQBUF(HASH[P].RH,J)THEN GOTO 40;
IF HASH[P].LH=0 THEN{206:}
BEGIN IF HASH[P].RH>0 THEN BEGIN REPEAT IF(HASHUSED=1)THEN OVERFLOW(330,
2100);HASHUSED:=HASHUSED-1;UNTIL HASH[HASHUSED].RH=0;
HASH[P].LH:=HASHUSED;P:=HASHUSED;END;
BEGIN IF POOLPTR+L>MAXPOOLPTR THEN BEGIN IF POOLPTR+L>POOLSIZE THEN
OVERFLOW(129,POOLSIZE-INITPOOLPTR);MAXPOOLPTR:=POOLPTR+L;END;END;
FOR K:=J TO J+L-1 DO BEGIN STRPOOL[POOLPTR]:=BUFFER[K];
POOLPTR:=POOLPTR+1;END;HASH[P].RH:=MAKESTRING;STRREF[HASH[P].RH]:=127;
STCOUNT:=STCOUNT+1;GOTO 40;END{:206};P:=HASH[P].LH;END;40:IDLOOKUP:=P;
END;{:204}{209:}PROCEDURE PRIMITIVE(S:STRNUMBER;C:HALFWORD;O:HALFWORD);
VAR K:POOLPOINTER;J:SMALLNUMBER;L:SMALLNUMBER;BEGIN K:=STRSTART[S];
L:=STRSTART[S+1]-K;FOR J:=0 TO L-1 DO BUFFER[J]:=STRPOOL[K+J];
CURSYM:=IDLOOKUP(0,L);IF S>=128 THEN BEGIN FLUSHSTRING(STRPTR-1);
HASH[CURSYM].RH:=S;END;EQTB[CURSYM].LH:=C;EQTB[CURSYM].RH:=O;END;{:209}
{214:}FUNCTION NEWNUMTOK(V:SCALED):HALFWORD;VAR P:HALFWORD;
BEGIN P:=GETNODE(2);MEM[P+1].INT:=V;MEM[P].HH.B0:=15;MEM[P].HH.B1:=12;
NEWNUMTOK:=P;END;{:214}{215:}PROCEDURE TOKENRECYCLE;FORWARD;
PROCEDURE FLUSHTOKENLI(P:HALFWORD);VAR Q:HALFWORD;
BEGIN WHILE P<>0 DO BEGIN Q:=P;P:=MEM[P].HH.RH;
IF Q>=HIMEMMIN THEN BEGIN MEM[Q].HH.RH:=AVAIL;AVAIL:=Q;
DYNUSED:=DYNUSED-1;END ELSE BEGIN CASE MEM[Q].HH.B0 OF 1,2,15:;
4:BEGIN IF STRREF[MEM[Q+1].INT]<127 THEN IF STRREF[MEM[Q+1].INT]>1 THEN
STRREF[MEM[Q+1].INT]:=STRREF[MEM[Q+1].INT]-1 ELSE FLUSHSTRING(MEM[Q+1].
INT);END;3,5,7,12,10,6,9,8,11,14,13,16,17,19:BEGIN GPOINTER:=Q;
TOKENRECYCLE;END;OTHERS:CONFUSION(360)END;FREENODE(Q,2);END;END;END;
{:215}{225:}PROCEDURE DELETEMACREF(P:HALFWORD);
BEGIN IF MEM[P].HH.LH=0 THEN FLUSHTOKENLI(P)ELSE MEM[P].HH.LH:=MEM[P].HH
.LH-1;END;{:225}{226:}{610:}PROCEDURE PRINTCMDMOD(C,M:INTEGER);
BEGIN CASE C OF{211:}18:PRINT(333);77:PRINT(332);60:PRINT(335);
72:PRINT(334);32:PRINT(325);78:PRINT(58);79:PRINT(44);58:PRINT(336);
19:PRINT(337);61:PRINT(338);27:PRINT(339);11:PRINT(340);81:PRINT(326);
26:PRINT(341);6:PRINT(342);9:PRINT(343);70:PRINT(344);73:PRINT(345);
13:PRINT(346);46:PRINT(123);53:PRINT(91);14:PRINT(347);15:PRINT(348);
69:PRINT(349);28:PRINT(350);47:PRINT(283);24:PRINT(351);7:PRINTCHAR(92);
65:PRINT(125);64:PRINT(93);12:PRINT(352);8:PRINT(353);80:PRINT(59);
17:PRINT(354);74:PRINT(355);35:PRINT(356);59:PRINT(357);71:PRINT(358);
75:PRINT(359);{:211}{669:}
16:IF M<=2 THEN IF M=1 THEN PRINT(517)ELSE IF M<1 THEN PRINT(327)ELSE
PRINT(518)ELSE IF M=54 THEN PRINT(519)ELSE IF M=44 THEN PRINT(520)ELSE
PRINT(521);
4:IF M<=1 THEN IF M=1 THEN PRINT(524)ELSE PRINT(328)ELSE IF M=2243 THEN
PRINT(522)ELSE PRINT(523);{:669}{674:}62:CASE M OF 1:PRINT(526);
2:PRINTCHAR(64);3:PRINT(527);OTHERS:PRINT(525)END;{:674}{681:}
57:IF M>=2243 THEN IF M=2243 THEN PRINT(538)ELSE IF M=2393 THEN PRINT(
539)ELSE PRINT(540)ELSE IF M<2 THEN PRINT(541)ELSE IF M=2 THEN PRINT(542
)ELSE PRINT(543);{:681}{694:}3:IF M=0 THEN PRINT(553)ELSE PRINT(479);
{:694}{725:}1,2:CASE M OF 1:PRINT(580);2:PRINT(324);3:PRINT(581);
OTHERS:PRINT(582)END;{:725}{877:}
33,34,37,56,45,50,36,43,55,48,51,52:PRINTOP(M);{:877}{996:}
30:PRINTTYPE(M);{:996}{1001:}82:IF M=0 THEN PRINT(773)ELSE PRINT(774);
{:1001}{1006:}23:CASE M OF 0:PRINT(145);1:PRINT(146);2:PRINT(147);
OTHERS:PRINT(779)END;{:1006}{1009:}
21:IF M=0 THEN PRINT(780)ELSE PRINT(781);{:1009}{1019:}
22:CASE M OF 0:PRINT(794);1:PRINT(795);2:PRINT(796);3:PRINT(797);
OTHERS:PRINT(798)END;{:1019}{1024:}
31,63:BEGIN IF C=31 THEN PRINT(801)ELSE PRINT(802);PRINT(803);
PRINT(HASH[M].RH);END;41:IF M=0 THEN PRINT(804)ELSE PRINT(805);
10:PRINT(806);54,44,49:BEGIN PRINTCMDMOD(16,C);PRINT(807);PRINTLN;
SHOWTOKENLIS(MEM[MEM[M].HH.RH].HH.RH,0,1000);END;5:PRINT(808);
40:PRINT(INTNAME[M]);{:1024}{1034:}
68:IF M=1 THEN PRINT(815)ELSE IF M=0 THEN PRINT(816)ELSE PRINT(817);
66:IF M=6 THEN PRINT(818)ELSE PRINT(819);
67:IF M=0 THEN PRINT(820)ELSE PRINT(821);{:1034}{1061:}
25:IF M<1 THEN PRINT(850)ELSE IF M=1 THEN PRINT(851)ELSE PRINT(852);
{:1061}{1083:}20:CASE M OF 0:PRINT(862);1:PRINT(863);2:PRINT(864);
3:PRINT(865);OTHERS:PRINT(866)END;{:1083}{1091:}
76:IF M=0 THEN PRINT(886)ELSE PRINT(887);{:1091}{1160:}
29:IF M=15 THEN PRINT(907)ELSE PRINT(906);{:1160}OTHERS:PRINT(463)END;
END;{:610}PROCEDURE SHOWMACRO(P:HALFWORD;Q,L:INTEGER);LABEL 10;
VAR R:HALFWORD;BEGIN P:=MEM[P].HH.RH;
WHILE MEM[P].HH.LH>7 DO BEGIN R:=MEM[P].HH.RH;MEM[P].HH.RH:=0;
SHOWTOKENLIS(P,0,L);MEM[P].HH.RH:=R;P:=R;
IF L>0 THEN L:=L-TALLY ELSE GOTO 10;END;TALLY:=0;
CASE MEM[P].HH.LH OF 0:PRINT(370);1,2,3:BEGIN PRINTCHAR(60);
PRINTCMDMOD(57,MEM[P].HH.LH);PRINT(371);END;4:PRINT(372);5:PRINT(373);
6:PRINT(374);7:PRINT(375);END;SHOWTOKENLIS(MEM[P].HH.RH,Q,L-TALLY);
10:END;{:226}{231:}PROCEDURE INITBIGNODE(P:HALFWORD);VAR Q:HALFWORD;
S:SMALLNUMBER;BEGIN S:=BIGNODESIZE[MEM[P].HH.B0];Q:=GETNODE(S);
REPEAT S:=S-2;MEM[Q+S].HH.B0:=19;MEM[Q+S+1].INT:=0;
MEM[Q+S].HH.B1:=(S)DIV 2+5;MEM[Q+S].HH.RH:=0;UNTIL S=0;MEM[Q].HH.RH:=P;
MEM[P+1].INT:=Q;END;{:231}{232:}FUNCTION IDTRANSFORM:HALFWORD;
VAR P,Q,R:HALFWORD;BEGIN P:=GETNODE(2);MEM[P].HH.B0:=13;
MEM[P].HH.B1:=11;MEM[P+1].INT:=0;INITBIGNODE(P);Q:=MEM[P+1].INT;R:=Q+12;
REPEAT R:=R-2;MEM[R].HH.B0:=15;MEM[R+1].INT:=0;UNTIL R=Q;
MEM[Q+5].INT:=65536;MEM[Q+11].INT:=65536;IDTRANSFORM:=P;END;{:232}{233:}
PROCEDURE NEWROOT(X:HALFWORD);VAR P:HALFWORD;BEGIN P:=GETNODE(2);
MEM[P].HH.B0:=0;MEM[P].HH.B1:=0;MEM[P].HH.RH:=X;EQTB[X].RH:=P;END;{:233}
{234:}PROCEDURE PRINTVARIABL(P:HALFWORD);LABEL 40,10;VAR Q:HALFWORD;
R:HALFWORD;BEGIN WHILE MEM[P].HH.B1>=5 DO{236:}
BEGIN CASE MEM[P].HH.B1 OF 5:PRINTCHAR(120);6:PRINTCHAR(121);
7:PRINT(378);8:PRINT(379);9:PRINT(380);10:PRINT(381);
11:BEGIN PRINT(382);PRINTINT(P-0);GOTO 10;END;END;PRINT(383);
P:=MEM[P-2*(MEM[P].HH.B1-5)].HH.RH;END{:236};Q:=0;
WHILE MEM[P].HH.B1>1 DO{235:}
BEGIN IF MEM[P].HH.B1=3 THEN BEGIN R:=NEWNUMTOK(MEM[P+2].INT);
REPEAT P:=MEM[P].HH.RH;UNTIL MEM[P].HH.B1=4;
END ELSE IF MEM[P].HH.B1=2 THEN BEGIN P:=MEM[P].HH.RH;GOTO 40;
END ELSE BEGIN IF MEM[P].HH.B1<>4 THEN CONFUSION(377);R:=GETAVAIL;
MEM[R].HH.LH:=MEM[P+2].HH.LH;END;MEM[R].HH.RH:=Q;Q:=R;
40:P:=MEM[P+2].HH.RH;END{:235};R:=GETAVAIL;MEM[R].HH.LH:=MEM[P].HH.RH;
MEM[R].HH.RH:=Q;IF MEM[P].HH.B1=1 THEN PRINT(376);
SHOWTOKENLIS(R,0,2147483647);FLUSHTOKENLI(R);10:END;{:234}{237:}
FUNCTION INTERESTING(P:HALFWORD):BOOLEAN;VAR T:SMALLNUMBER;
BEGIN IF INTERNAL[3]>0 THEN INTERESTING:=TRUE ELSE BEGIN T:=MEM[P].HH.B1
;IF T>=5 THEN IF T<>11 THEN T:=MEM[MEM[P-2*(T-5)].HH.RH].HH.B1;
INTERESTING:=(T<>11);END;END;{:237}{238:}
FUNCTION NEWSTRUCTURE(P:HALFWORD):HALFWORD;VAR Q,R:HALFWORD;
BEGIN CASE MEM[P].HH.B1 OF 0:BEGIN Q:=MEM[P].HH.RH;R:=GETNODE(2);
EQTB[Q].RH:=R;END;3:{239:}BEGIN Q:=P;REPEAT Q:=MEM[Q].HH.RH;
UNTIL MEM[Q].HH.B1=4;Q:=MEM[Q+2].HH.RH;R:=Q+1;REPEAT Q:=R;
R:=MEM[R].HH.RH;UNTIL R=P;R:=GETNODE(3);MEM[Q].HH.RH:=R;
MEM[R+2].INT:=MEM[P+2].INT;END{:239};4:{240:}BEGIN Q:=MEM[P+2].HH.RH;
R:=MEM[Q+1].HH.LH;REPEAT Q:=R;R:=MEM[R].HH.RH;UNTIL R=P;R:=GETNODE(3);
MEM[Q].HH.RH:=R;MEM[R+2]:=MEM[P+2];
IF MEM[P+2].HH.LH=0 THEN BEGIN Q:=MEM[P+2].HH.RH+1;
WHILE MEM[Q].HH.RH<>P DO Q:=MEM[Q].HH.RH;MEM[Q].HH.RH:=R;END;END{:240};
OTHERS:CONFUSION(384)END;MEM[R].HH.RH:=MEM[P].HH.RH;MEM[R].HH.B0:=21;
MEM[R].HH.B1:=MEM[P].HH.B1;MEM[R+1].HH.LH:=P;MEM[P].HH.B1:=2;
Q:=GETNODE(3);MEM[P].HH.RH:=Q;MEM[R+1].HH.RH:=Q;MEM[Q+2].HH.RH:=R;
MEM[Q].HH.B0:=0;MEM[Q].HH.B1:=4;MEM[Q].HH.RH:=17;MEM[Q+2].HH.LH:=0;
NEWSTRUCTURE:=R;END;{:238}{241:}
FUNCTION FINDVARIABLE(T:HALFWORD):HALFWORD;LABEL 10;
VAR P,Q,R,S:HALFWORD;PP,QQ,RR,SS:HALFWORD;N:INTEGER;SAVEWORD:MEMORYWORD;
BEGIN P:=MEM[T].HH.LH;T:=MEM[T].HH.RH;
IF EQTB[P].LH MOD 83<>41 THEN BEGIN FINDVARIABLE:=0;GOTO 10;END;
IF EQTB[P].RH=0 THEN NEWROOT(P);P:=EQTB[P].RH;PP:=P;
WHILE T<>0 DO BEGIN{242:}
IF MEM[PP].HH.B0<>21 THEN BEGIN IF MEM[PP].HH.B0>21 THEN BEGIN
FINDVARIABLE:=0;GOTO 10;END;SS:=NEWSTRUCTURE(PP);IF P=PP THEN P:=SS;
PP:=SS;END;IF MEM[P].HH.B0<>21 THEN P:=NEWSTRUCTURE(P){:242};
IF T<HIMEMMIN THEN{243:}BEGIN N:=MEM[T+1].INT;
PP:=MEM[MEM[PP+1].HH.LH].HH.RH;Q:=MEM[MEM[P+1].HH.LH].HH.RH;
SAVEWORD:=MEM[Q+2];MEM[Q+2].INT:=2147483647;S:=P+1;REPEAT R:=S;
S:=MEM[S].HH.RH;UNTIL N<=MEM[S+2].INT;
IF N=MEM[S+2].INT THEN P:=S ELSE BEGIN P:=GETNODE(3);MEM[R].HH.RH:=P;
MEM[P].HH.RH:=S;MEM[P+2].INT:=N;MEM[P].HH.B1:=3;MEM[P].HH.B0:=0;END;
MEM[Q+2]:=SAVEWORD;END{:243}ELSE{244:}BEGIN N:=MEM[T].HH.LH;
SS:=MEM[PP+1].HH.LH;REPEAT RR:=SS;SS:=MEM[SS].HH.RH;
UNTIL N<=MEM[SS+2].HH.LH;IF N<MEM[SS+2].HH.LH THEN BEGIN QQ:=GETNODE(3);
MEM[RR].HH.RH:=QQ;MEM[QQ].HH.RH:=SS;MEM[QQ+2].HH.LH:=N;MEM[QQ].HH.B1:=4;
MEM[QQ].HH.B0:=0;MEM[QQ+2].HH.RH:=PP;SS:=QQ;END;
IF P=PP THEN BEGIN P:=SS;PP:=SS;END ELSE BEGIN PP:=SS;S:=MEM[P+1].HH.LH;
REPEAT R:=S;S:=MEM[S].HH.RH;UNTIL N<=MEM[S+2].HH.LH;
IF N=MEM[S+2].HH.LH THEN P:=S ELSE BEGIN Q:=GETNODE(3);MEM[R].HH.RH:=Q;
MEM[Q].HH.RH:=S;MEM[Q+2].HH.LH:=N;MEM[Q].HH.B1:=4;MEM[Q].HH.B0:=0;
MEM[Q+2].HH.RH:=P;P:=Q;END;END;END{:244};T:=MEM[T].HH.RH;END;
IF MEM[PP].HH.B0>=21 THEN IF MEM[PP].HH.B0=21 THEN PP:=MEM[PP+1].HH.LH
ELSE BEGIN FINDVARIABLE:=0;GOTO 10;END;
IF MEM[P].HH.B0=21 THEN P:=MEM[P+1].HH.LH;
IF MEM[P].HH.B0=0 THEN BEGIN IF MEM[PP].HH.B0=0 THEN BEGIN MEM[PP].HH.B0
:=18;MEM[PP+1].INT:=0;END;MEM[P].HH.B0:=MEM[PP].HH.B0;MEM[P+1].INT:=0;
END;FINDVARIABLE:=P;10:END;{:241}{245:}{256:}
PROCEDURE PRINTPATH(H:HALFWORD;S:STRNUMBER;NULINE:BOOLEAN);LABEL 30,31;
VAR P,Q:HALFWORD;BEGIN PRINTDIAGNOS(385,S,NULINE);PRINTLN;P:=H;
REPEAT Q:=MEM[P].HH.RH;IF(P=0)OR(Q=0)THEN BEGIN PRINTNL(131);GOTO 30;
END;{257:}PRINTTWO(MEM[P+1].INT,MEM[P+2].INT);
CASE MEM[P].HH.B1 OF 0:BEGIN IF MEM[P].HH.B0=4 THEN PRINT(386);
IF(MEM[Q].HH.B0<>0)OR(Q<>H)THEN Q:=0;GOTO 31;END;1:{260:}
BEGIN PRINT(392);PRINTTWO(MEM[P+5].INT,MEM[P+6].INT);PRINT(391);
IF MEM[Q].HH.B0<>1 THEN PRINT(393)ELSE PRINTTWO(MEM[Q+3].INT,MEM[Q+4].
INT);GOTO 31;END{:260};4:{261:}
IF(MEM[P].HH.B0<>1)AND(MEM[P].HH.B0<>4)THEN PRINT(386){:261};3,2:{262:}
BEGIN IF MEM[P].HH.B0=4 THEN PRINT(393);
IF MEM[P].HH.B1=3 THEN BEGIN PRINT(389);PRINTSCALED(MEM[P+5].INT);
END ELSE BEGIN NSINCOS(MEM[P+5].INT);PRINTCHAR(123);PRINTSCALED(NCOS);
PRINTCHAR(44);PRINTSCALED(NSIN);END;PRINTCHAR(125);END{:262};
OTHERS:PRINT(131)END;
IF MEM[Q].HH.B0<=1 THEN PRINT(387)ELSE IF(MEM[P+6].INT<>65536)OR(MEM[Q+4
].INT<>65536)THEN{259:}BEGIN PRINT(390);
IF MEM[P+6].INT<0 THEN PRINT(335);PRINTSCALED(ABS(MEM[P+6].INT));
IF MEM[P+6].INT<>MEM[Q+4].INT THEN BEGIN PRINT(391);
IF MEM[Q+4].INT<0 THEN PRINT(335);PRINTSCALED(ABS(MEM[Q+4].INT));END;
END{:259};31:{:257};P:=Q;IF(P<>H)OR(MEM[H].HH.B0<>0)THEN{258:}
BEGIN PRINTNL(388);IF MEM[P].HH.B0=2 THEN BEGIN NSINCOS(MEM[P+3].INT);
PRINTCHAR(123);PRINTSCALED(NCOS);PRINTCHAR(44);PRINTSCALED(NSIN);
PRINTCHAR(125);END ELSE IF MEM[P].HH.B0=3 THEN BEGIN PRINT(389);
PRINTSCALED(MEM[P+3].INT);PRINTCHAR(125);END;END{:258};UNTIL P=H;
IF MEM[H].HH.B0<>0 THEN PRINT(260);30:ENDDIAGNOSTI(TRUE);END;{:256}
{331:}{332:}PROCEDURE PRINTWEIGHT(Q:HALFWORD);VAR W,M:INTEGER;D:INTEGER;
BEGIN D:=0+MEM[Q].HH.LH-0;W:=D MOD 8;M:=(D DIV 8)-MEM[CUREDGES+3].HH.LH;
IF FILEOFFSET>MAXPRINTLINE-9 THEN PRINTNL(32)ELSE PRINTCHAR(32);
PRINTINT(M);WHILE W>4 DO BEGIN PRINTCHAR(43);W:=W-1;END;
WHILE W<4 DO BEGIN PRINTCHAR(45);W:=W+1;END;END;{:332}
PROCEDURE PRINTEDGES(S:STRNUMBER;NULINE:BOOLEAN);VAR P,Q,R:HALFWORD;
N:INTEGER;BEGIN PRINTDIAGNOS(400,S,NULINE);P:=MEM[CUREDGES].HH.LH;
N:=MEM[CUREDGES+1].HH.RH-4096;
WHILE P<>CUREDGES DO BEGIN Q:=MEM[P+1].HH.LH;R:=MEM[P+1].HH.RH;
IF(Q>1)OR(R<>3000)THEN BEGIN PRINTNL(401);PRINTINT(N);PRINTCHAR(58);
WHILE Q>1 DO BEGIN PRINTWEIGHT(Q);Q:=MEM[Q].HH.RH;END;PRINT(402);
WHILE R<>3000 DO BEGIN PRINTWEIGHT(R);R:=MEM[R].HH.RH;END;END;
P:=MEM[P].HH.LH;N:=N-1;END;ENDDIAGNOSTI(TRUE);END;{:331}{383:}
PROCEDURE UNSKEW(X,Y:SCALED;OCTANT:SMALLNUMBER);
BEGIN CASE OCTANT OF 1:BEGIN CURX:=X+Y;CURY:=Y;END;5:BEGIN CURX:=Y;
CURY:=X+Y;END;6:BEGIN CURX:=-Y;CURY:=X+Y;END;2:BEGIN CURX:=-X-Y;CURY:=Y;
END;4:BEGIN CURX:=-X-Y;CURY:=-Y;END;8:BEGIN CURX:=-Y;CURY:=-X-Y;END;
7:BEGIN CURX:=Y;CURY:=-X-Y;END;3:BEGIN CURX:=X+Y;CURY:=-Y;END;END;END;
{:383}{460:}PROCEDURE PRINTPEN(P:HALFWORD;S:STRNUMBER;NULINE:BOOLEAN);
VAR NOTHINGPRINT:BOOLEAN;K:1..8;H:HALFWORD;M,N:INTEGER;W,WW:HALFWORD;
BEGIN PRINTDIAGNOS(431,S,NULINE);NOTHINGPRINT:=TRUE;PRINTLN;
FOR K:=1 TO 8 DO BEGIN OCTANT:=OCTANTCODE[K];H:=P+OCTANT;
N:=MEM[H].HH.LH;W:=MEM[H].HH.RH;IF NOT ODD(K)THEN W:=MEM[W].HH.LH;
FOR M:=1 TO N+1 DO BEGIN IF ODD(K)THEN WW:=MEM[W].HH.RH ELSE WW:=MEM[W].
HH.LH;
IF(MEM[WW+1].INT<>MEM[W+1].INT)OR(MEM[WW+2].INT<>MEM[W+2].INT)THEN{461:}
BEGIN IF NOTHINGPRINT THEN NOTHINGPRINT:=FALSE ELSE PRINTNL(433);
UNSKEW(MEM[WW+1].INT,MEM[WW+2].INT,OCTANT);PRINTTWO(CURX,CURY);END{:461}
;W:=WW;END;END;IF NOTHINGPRINT THEN BEGIN W:=MEM[P+1].HH.RH;
PRINTTWO(MEM[W+1].INT+MEM[W+2].INT,MEM[W+2].INT);END;PRINTNL(432);
ENDDIAGNOSTI(TRUE);END;{:460}{574:}PROCEDURE PRINTDEPENDE(P:HALFWORD;
T:SMALLNUMBER);LABEL 10;VAR V:INTEGER;PP,Q:HALFWORD;BEGIN PP:=P;
WHILE TRUE DO BEGIN V:=ABS(MEM[P+1].INT);Q:=MEM[P].HH.LH;
IF Q=0 THEN BEGIN IF(V<>0)OR(P=PP)THEN BEGIN IF MEM[P+1].INT>0 THEN IF P
<>PP THEN PRINTCHAR(43);PRINTSCALED(MEM[P+1].INT);END;GOTO 10;END;{575:}
IF MEM[P+1].INT<0 THEN PRINTCHAR(45)ELSE IF P<>PP THEN PRINTCHAR(43);
IF T=16 THEN V:=ROUNDFRACTIO(V);IF V<>65536 THEN PRINTSCALED(V){:575};
IF MEM[Q].HH.B0<>19 THEN CONFUSION(449);PRINTVARIABL(Q);V:=MEM[Q+1].INT;
WHILE V>0 DO BEGIN PRINT(450);V:=V-2;END;P:=MEM[P].HH.RH;END;10:END;
{:574}{784:}{788:}PROCEDURE PRINTDP(T:SMALLNUMBER;P:HALFWORD;
VERBOSITY:SMALLNUMBER);VAR Q:HALFWORD;BEGIN Q:=MEM[P].HH.RH;
IF(MEM[Q].HH.LH=0)OR(VERBOSITY>0)THEN PRINTDEPENDE(P,T)ELSE PRINT(628);
END;{:788}{782:}FUNCTION STASHCUREXP:HALFWORD;VAR P:HALFWORD;
BEGIN CASE CURTYPE OF 3,5,7,12,10,13,14,16,17,19:P:=CUREXP;
OTHERS:BEGIN P:=GETNODE(2);MEM[P].HH.B1:=11;MEM[P].HH.B0:=CURTYPE;
MEM[P+1].INT:=CUREXP;END END;CURTYPE:=1;MEM[P].HH.RH:=1;STASHCUREXP:=P;
END;{:782}{783:}PROCEDURE UNSTASHCUREX(P:HALFWORD);
BEGIN CURTYPE:=MEM[P].HH.B0;
CASE CURTYPE OF 3,5,7,12,10,13,14,16,17,19:CUREXP:=P;
OTHERS:BEGIN CUREXP:=MEM[P+1].INT;FREENODE(P,2);END END;END;{:783}
PROCEDURE PRINTEXP(P:HALFWORD;VERBOSITY:SMALLNUMBER);
VAR RESTORECUREX:BOOLEAN;T:SMALLNUMBER;V:INTEGER;Q:HALFWORD;
BEGIN IF P<>0 THEN RESTORECUREX:=FALSE ELSE BEGIN P:=STASHCUREXP;
RESTORECUREX:=TRUE;END;T:=MEM[P].HH.B0;
IF T<16 THEN V:=MEM[P+1].INT ELSE IF T<19 THEN V:=MEM[P+1].HH.RH;{785:}
CASE T OF 1:PRINT(198);2:IF V=30 THEN PRINT(222)ELSE PRINT(223);
3,5,7,12,10,18:{789:}BEGIN PRINTTYPE(T);
IF V<>0 THEN BEGIN PRINTCHAR(32);
WHILE(MEM[V].HH.B1=11)AND(V<>P)DO V:=MEM[V+1].INT;PRINTVARIABL(V);END;
END{:789};4:BEGIN PRINTCHAR(34);SLOWPRINT(V);PRINTCHAR(34);END;
6,8,9,11:{787:}
IF VERBOSITY<=1 THEN PRINTTYPE(T)ELSE BEGIN IF SELECTOR=3 THEN IF
INTERNAL[12]<=0 THEN BEGIN SELECTOR:=1;PRINTTYPE(T);PRINT(626);
SELECTOR:=3;END;CASE T OF 6:PRINTPEN(V,157,FALSE);
8:PRINTPATH(V,627,FALSE);9:PRINTPATH(V,157,FALSE);11:BEGIN CUREDGES:=V;
PRINTEDGES(157,FALSE);END;END;END{:787};
13,14:IF V=0 THEN PRINTTYPE(T)ELSE{786:}BEGIN PRINTCHAR(40);
Q:=V+BIGNODESIZE[T];
REPEAT IF MEM[V].HH.B0=15 THEN PRINTSCALED(MEM[V+1].INT)ELSE IF MEM[V].
HH.B0=19 THEN PRINTVARIABL(V)ELSE PRINTDP(MEM[V].HH.B0,MEM[V+1].HH.RH,
VERBOSITY);V:=V+2;IF V<>Q THEN PRINTCHAR(44);UNTIL V=Q;PRINTCHAR(41);
END{:786};15:PRINTSCALED(V);16,17:PRINTDP(T,V,VERBOSITY);
19:PRINTVARIABL(P);OTHERS:CONFUSION(625)END{:785};
IF RESTORECUREX THEN UNSTASHCUREX(P);END;{:784}{790:}
PROCEDURE DISPERR(P:HALFWORD;S:STRNUMBER);
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(629);PRINTEXP(P,1);
IF S<>157 THEN BEGIN PRINTNL(133);PRINT(S);END;END;{:790}{579:}
FUNCTION PPLUSFQ(P:HALFWORD;F:INTEGER;Q:HALFWORD;
T,TT:SMALLNUMBER):HALFWORD;LABEL 30;VAR PP,QQ:HALFWORD;R,S:HALFWORD;
THRESHOLD:INTEGER;V:INTEGER;
BEGIN IF T=16 THEN THRESHOLD:=2685 ELSE THRESHOLD:=8;R:=2999;
PP:=MEM[P].HH.LH;QQ:=MEM[Q].HH.LH;
WHILE TRUE DO IF PP=QQ THEN IF PP=0 THEN GOTO 30 ELSE{580:}
BEGIN IF TT=16 THEN V:=MEM[P+1].INT+TAKEFRACTION(F,MEM[Q+1].INT)ELSE V:=
MEM[P+1].INT+TAKESCALED(F,MEM[Q+1].INT);MEM[P+1].INT:=V;S:=P;
P:=MEM[P].HH.RH;
IF ABS(V)<THRESHOLD THEN FREENODE(S,2)ELSE BEGIN IF ABS(V)>=626349397
THEN IF WATCHCOEFS THEN BEGIN MEM[QQ].HH.B0:=0;FIXNEEDED:=TRUE;END;
MEM[R].HH.RH:=S;R:=S;END;PP:=MEM[P].HH.LH;Q:=MEM[Q].HH.RH;
QQ:=MEM[Q].HH.LH;END{:580}ELSE IF PP<QQ THEN{581:}
BEGIN IF TT=16 THEN V:=TAKEFRACTION(F,MEM[Q+1].INT)ELSE V:=TAKESCALED(F,
MEM[Q+1].INT);IF ABS(V)>(THRESHOLD)DIV 2 THEN BEGIN S:=GETNODE(2);
MEM[S].HH.LH:=QQ;MEM[S+1].INT:=V;
IF ABS(V)>=626349397 THEN IF WATCHCOEFS THEN BEGIN MEM[QQ].HH.B0:=0;
FIXNEEDED:=TRUE;END;MEM[R].HH.RH:=S;R:=S;END;Q:=MEM[Q].HH.RH;
QQ:=MEM[Q].HH.LH;END{:581}ELSE BEGIN MEM[R].HH.RH:=P;R:=P;
P:=MEM[P].HH.RH;PP:=MEM[P].HH.LH;END;
30:IF T=16 THEN MEM[P+1].INT:=SLOWADD(MEM[P+1].INT,TAKEFRACTION(MEM[Q+1]
.INT,F))ELSE MEM[P+1].INT:=SLOWADD(MEM[P+1].INT,TAKESCALED(MEM[Q+1].INT,
F));MEM[R].HH.RH:=P;DEPFINAL:=P;PPLUSFQ:=MEM[2999].HH.RH;END;{:579}
{585:}FUNCTION POVERV(P:HALFWORD;V:SCALED;T0,T1:SMALLNUMBER):HALFWORD;
VAR R,S:HALFWORD;W:INTEGER;THRESHOLD:INTEGER;SCALINGDOWN:BOOLEAN;
BEGIN IF T0<>T1 THEN SCALINGDOWN:=TRUE ELSE SCALINGDOWN:=FALSE;
IF T1=16 THEN THRESHOLD:=1342 ELSE THRESHOLD:=4;R:=2999;
WHILE MEM[P].HH.LH<>0 DO BEGIN IF SCALINGDOWN THEN IF ABS(V)<524288 THEN
W:=MAKESCALED(MEM[P+1].INT,V*4096)ELSE W:=MAKESCALED(ROUNDFRACTIO(MEM[P
+1].INT),V)ELSE W:=MAKESCALED(MEM[P+1].INT,V);
IF ABS(W)<=THRESHOLD THEN BEGIN S:=MEM[P].HH.RH;FREENODE(P,2);P:=S;
END ELSE BEGIN IF ABS(W)>=626349397 THEN BEGIN FIXNEEDED:=TRUE;
MEM[MEM[P].HH.LH].HH.B0:=0;END;MEM[R].HH.RH:=P;R:=P;MEM[P+1].INT:=W;
P:=MEM[P].HH.RH;END;END;MEM[R].HH.RH:=P;
MEM[P+1].INT:=MAKESCALED(MEM[P+1].INT,V);POVERV:=MEM[2999].HH.RH;END;
{:585}{587:}PROCEDURE VALTOOBIG(X:SCALED);
BEGIN IF INTERNAL[38]>0 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(451);END;PRINTSCALED(X);PRINTCHAR(41);
BEGIN HELPPTR:=4;HELPLINE[3]:=452;HELPLINE[2]:=453;HELPLINE[1]:=454;
HELPLINE[0]:=455;END;ERROR;END;END;{:587}{588:}
PROCEDURE MAKEKNOWN(P,Q:HALFWORD);VAR T:16..17;
BEGIN MEM[MEM[Q].HH.RH+1].HH.LH:=MEM[P+1].HH.LH;
MEM[MEM[P+1].HH.LH].HH.RH:=MEM[Q].HH.RH;T:=MEM[P].HH.B0;
MEM[P].HH.B0:=15;MEM[P+1].INT:=MEM[Q+1].INT;FREENODE(Q,2);
IF ABS(MEM[P+1].INT)>=268435456 THEN VALTOOBIG(MEM[P+1].INT);
IF INTERNAL[2]>0 THEN IF INTERESTING(P)THEN BEGIN BEGINDIAGNOS;
PRINTNL(456);PRINTVARIABL(P);PRINTCHAR(61);PRINTSCALED(MEM[P+1].INT);
ENDDIAGNOSTI(FALSE);END;
IF CUREXP=P THEN IF CURTYPE=T THEN BEGIN CURTYPE:=15;
CUREXP:=MEM[P+1].INT;FREENODE(P,2);END;END;{:588}{589:}
PROCEDURE FIXDEPENDENC;LABEL 30;VAR P,Q,R,S,T:HALFWORD;X:HALFWORD;
BEGIN R:=MEM[13].HH.RH;S:=0;WHILE R<>13 DO BEGIN T:=R;{590:}R:=T+1;
WHILE TRUE DO BEGIN Q:=MEM[R].HH.RH;X:=MEM[Q].HH.LH;IF X=0 THEN GOTO 30;
IF MEM[X].HH.B0<=1 THEN BEGIN IF MEM[X].HH.B0<1 THEN BEGIN P:=GETAVAIL;
MEM[P].HH.RH:=S;S:=P;MEM[S].HH.LH:=X;MEM[X].HH.B0:=1;END;
MEM[Q+1].INT:=MEM[Q+1].INT DIV 4;
IF MEM[Q+1].INT=0 THEN BEGIN MEM[R].HH.RH:=MEM[Q].HH.RH;FREENODE(Q,2);
Q:=R;END;END;R:=Q;END;30:{:590};R:=MEM[Q].HH.RH;
IF Q=MEM[T+1].HH.RH THEN MAKEKNOWN(T,Q);END;
WHILE S<>0 DO BEGIN P:=MEM[S].HH.RH;X:=MEM[S].HH.LH;
BEGIN MEM[S].HH.RH:=AVAIL;AVAIL:=S;DYNUSED:=DYNUSED-1;END;S:=P;
MEM[X].HH.B0:=19;MEM[X+1].INT:=MEM[X+1].INT+2;END;FIXNEEDED:=FALSE;END;
{:589}{267:}PROCEDURE TOSSKNOTLIST(P:HALFWORD);VAR Q:HALFWORD;
R:HALFWORD;BEGIN Q:=P;REPEAT R:=MEM[Q].HH.RH;FREENODE(Q,7);Q:=R;
UNTIL Q=P;END;{:267}{380:}PROCEDURE TOSSEDGES(H:HALFWORD);
VAR P,Q:HALFWORD;BEGIN Q:=MEM[H].HH.RH;
WHILE Q<>H DO BEGIN FLUSHLIST(MEM[Q+1].HH.RH);
IF MEM[Q+1].HH.LH>1 THEN FLUSHLIST(MEM[Q+1].HH.LH);P:=Q;Q:=MEM[Q].HH.RH;
FREENODE(P,2);END;FREENODE(H,6);END;{:380}{474:}
PROCEDURE TOSSPEN(P:HALFWORD);VAR K:1..8;W,WW:HALFWORD;
BEGIN IF P<>3 THEN BEGIN FOR K:=1 TO 8 DO BEGIN W:=MEM[P+K].HH.RH;
REPEAT WW:=MEM[W].HH.RH;FREENODE(W,3);W:=WW;UNTIL W=MEM[P+K].HH.RH;END;
FREENODE(P,10);END;END;{:474}{605:}PROCEDURE RINGDELETE(P:HALFWORD);
VAR Q:HALFWORD;BEGIN Q:=MEM[P+1].INT;
IF Q<>0 THEN IF Q<>P THEN BEGIN WHILE MEM[Q+1].INT<>P DO Q:=MEM[Q+1].INT
;MEM[Q+1].INT:=MEM[P+1].INT;END;END;{:605}{792:}
PROCEDURE RECYCLEVALUE(P:HALFWORD);LABEL 30;VAR T:SMALLNUMBER;V:INTEGER;
VV:INTEGER;Q,R,S,PP:HALFWORD;BEGIN T:=MEM[P].HH.B0;
IF T<16 THEN V:=MEM[P+1].INT;CASE T OF 0,1,2,15,18:;
3,5,7,12,10:RINGDELETE(P);
4:BEGIN IF STRREF[V]<127 THEN IF STRREF[V]>1 THEN STRREF[V]:=STRREF[V]-1
ELSE FLUSHSTRING(V);END;
6:IF MEM[V].HH.LH=0 THEN TOSSPEN(V)ELSE MEM[V].HH.LH:=MEM[V].HH.LH-1;
9,8:TOSSKNOTLIST(V);11:TOSSEDGES(V);14,13:{793:}
IF V<>0 THEN BEGIN Q:=V+BIGNODESIZE[T];REPEAT Q:=Q-2;RECYCLEVALUE(Q);
UNTIL Q=V;FREENODE(V,BIGNODESIZE[T]);END{:793};16,17:{794:}
BEGIN Q:=MEM[P+1].HH.RH;WHILE MEM[Q].HH.LH<>0 DO Q:=MEM[Q].HH.RH;
MEM[MEM[P+1].HH.LH].HH.RH:=MEM[Q].HH.RH;
MEM[MEM[Q].HH.RH+1].HH.LH:=MEM[P+1].HH.LH;MEM[Q].HH.RH:=0;
FLUSHNODELIS(MEM[P+1].HH.RH);END{:794};19:{795:}BEGIN MAXC[16]:=0;
MAXC[17]:=0;MAXLINK[16]:=0;MAXLINK[17]:=0;Q:=MEM[13].HH.RH;
WHILE Q<>13 DO BEGIN S:=Q+1;WHILE TRUE DO BEGIN R:=MEM[S].HH.RH;
IF MEM[R].HH.LH=0 THEN GOTO 30;
IF MEM[R].HH.LH<>P THEN S:=R ELSE BEGIN T:=MEM[Q].HH.B0;
MEM[S].HH.RH:=MEM[R].HH.RH;MEM[R].HH.LH:=Q;
IF ABS(MEM[R+1].INT)>MAXC[T]THEN{797:}
BEGIN IF MAXC[T]>0 THEN BEGIN MEM[MAXPTR[T]].HH.RH:=MAXLINK[T];
MAXLINK[T]:=MAXPTR[T];END;MAXC[T]:=ABS(MEM[R+1].INT);MAXPTR[T]:=R;
END{:797}ELSE BEGIN MEM[R].HH.RH:=MAXLINK[T];MAXLINK[T]:=R;END;END;END;
30:Q:=MEM[R].HH.RH;END;IF(MAXC[16]>0)OR(MAXC[17]>0)THEN{798:}
BEGIN IF(MAXC[16]>=268435456)OR(MAXC[16]DIV 4096>=MAXC[17])THEN T:=16
ELSE T:=17;{799:}R:=MAXPTR[T];PP:=MEM[R].HH.LH;V:=MEM[R+1].INT;
IF T=16 THEN MEM[R+1].INT:=-268435456 ELSE MEM[R+1].INT:=-65536;Q:=PP+1;
S:=MEM[Q].HH.RH;WHILE MEM[S].HH.LH>PP DO BEGIN Q:=S;S:=MEM[Q].HH.RH;END;
MEM[Q].HH.RH:=R;MEM[R].HH.RH:=S;
WHILE MEM[S].HH.LH<>0 DO S:=MEM[S].HH.RH;Q:=MEM[S].HH.RH;
MEM[S].HH.RH:=0;S:=MEM[PP+1].HH.RH;MEM[Q+1].HH.LH:=MEM[PP+1].HH.LH;
MEM[MEM[PP+1].HH.LH].HH.RH:=Q;MEM[PP].HH.B0:=19;MEM[PP+1].INT:=0;
IF CUREXP=PP THEN IF CURTYPE=T THEN CURTYPE:=19;
IF INTERNAL[2]>0 THEN{800:}IF INTERESTING(P)THEN BEGIN BEGINDIAGNOS;
PRINTNL(631);IF V>0 THEN PRINTCHAR(45);
IF T=16 THEN VV:=ROUNDFRACTIO(MAXC[16])ELSE VV:=MAXC[17];
IF VV<>65536 THEN PRINTSCALED(VV);PRINTVARIABL(P);
WHILE MEM[P+1].INT>0 DO BEGIN PRINT(450);MEM[P+1].INT:=MEM[P+1].INT-2;
END;IF T=16 THEN PRINTCHAR(61)ELSE PRINT(632);PRINTDEPENDE(S,T);
ENDDIAGNOSTI(FALSE);END{:800}{:799};T:=33-T;
IF MAXC[T]>0 THEN BEGIN MEM[MAXPTR[T]].HH.RH:=MAXLINK[T];
MAXLINK[T]:=MAXPTR[T];END;IF T<>16 THEN{801:}
FOR T:=16 TO 17 DO BEGIN R:=MAXLINK[T];
WHILE R<>0 DO BEGIN Q:=MEM[R].HH.LH;
MEM[Q+1].HH.RH:=PPLUSFQ(MEM[Q+1].HH.RH,MAKEFRACTION(MEM[R+1].INT,-V),S,T
,16);IF MEM[Q+1].HH.RH=DEPFINAL THEN MAKEKNOWN(Q,DEPFINAL);Q:=R;
R:=MEM[R].HH.RH;FREENODE(Q,2);END;END{:801}ELSE{802:}
FOR T:=16 TO 17 DO BEGIN R:=MAXLINK[T];
WHILE R<>0 DO BEGIN Q:=MEM[R].HH.LH;
IF T=16 THEN BEGIN IF CUREXP=Q THEN IF CURTYPE=16 THEN CURTYPE:=17;
MEM[Q+1].HH.RH:=POVERV(MEM[Q+1].HH.RH,65536,16,17);MEM[Q].HH.B0:=17;
MEM[R+1].INT:=ROUNDFRACTIO(MEM[R+1].INT);END;
MEM[Q+1].HH.RH:=PPLUSFQ(MEM[Q+1].HH.RH,MAKESCALED(MEM[R+1].INT,-V),S,17,
17);IF MEM[Q+1].HH.RH=DEPFINAL THEN MAKEKNOWN(Q,DEPFINAL);Q:=R;
R:=MEM[R].HH.RH;FREENODE(Q,2);END;END{:802};FLUSHNODELIS(S);
IF FIXNEEDED THEN FIXDEPENDENC;BEGIN IF ARITHERROR THEN CLEARARITH;END;
END{:798};END{:795};20,21:CONFUSION(630);
22,23:DELETEMACREF(MEM[P+1].INT);END;MEM[P].HH.B0:=0;END;{:792}{791:}
PROCEDURE FLUSHCUREXP(V:SCALED);
BEGIN CASE CURTYPE OF 3,5,7,12,10,13,14,16,17,19:BEGIN RECYCLEVALUE(
CUREXP);FREENODE(CUREXP,2);END;
6:IF MEM[CUREXP].HH.LH=0 THEN TOSSPEN(CUREXP)ELSE MEM[CUREXP].HH.LH:=MEM
[CUREXP].HH.LH-1;
4:BEGIN IF STRREF[CUREXP]<127 THEN IF STRREF[CUREXP]>1 THEN STRREF[
CUREXP]:=STRREF[CUREXP]-1 ELSE FLUSHSTRING(CUREXP);END;
8,9:TOSSKNOTLIST(CUREXP);11:TOSSEDGES(CUREXP);OTHERS:END;CURTYPE:=15;
CUREXP:=V;END;{:791}{803:}PROCEDURE FLUSHERROR(V:SCALED);BEGIN ERROR;
FLUSHCUREXP(V);END;PROCEDURE BACKERROR;FORWARD;PROCEDURE GETXNEXT;
FORWARD;PROCEDURE PUTGETERROR;BEGIN BACKERROR;GETXNEXT;END;
PROCEDURE PUTGETFLUSHE(V:SCALED);BEGIN PUTGETERROR;FLUSHCUREXP(V);END;
{:803}{246:}PROCEDURE FLUSHBELOWVA(P:HALFWORD);VAR Q,R:HALFWORD;
BEGIN IF MEM[P].HH.B0<>21 THEN RECYCLEVALUE(P)ELSE BEGIN Q:=MEM[P+1].HH.
RH;WHILE MEM[Q].HH.B1=3 DO BEGIN FLUSHBELOWVA(Q);R:=Q;Q:=MEM[Q].HH.RH;
FREENODE(R,3);END;R:=MEM[P+1].HH.LH;Q:=MEM[R].HH.RH;RECYCLEVALUE(R);
IF MEM[P].HH.B1<=1 THEN FREENODE(R,2)ELSE FREENODE(R,3);
REPEAT FLUSHBELOWVA(Q);R:=Q;Q:=MEM[Q].HH.RH;FREENODE(R,3);UNTIL Q=17;
MEM[P].HH.B0:=0;END;END;{:246}PROCEDURE FLUSHVARIABL(P,T:HALFWORD;
DISCARDSUFFI:BOOLEAN);LABEL 10;VAR Q,R:HALFWORD;N:HALFWORD;
BEGIN WHILE T<>0 DO BEGIN IF MEM[P].HH.B0<>21 THEN GOTO 10;
N:=MEM[T].HH.LH;T:=MEM[T].HH.RH;IF N=0 THEN BEGIN R:=P+1;
Q:=MEM[R].HH.RH;
WHILE MEM[Q].HH.B1=3 DO BEGIN FLUSHVARIABL(Q,T,DISCARDSUFFI);
IF T=0 THEN IF MEM[Q].HH.B0=21 THEN R:=Q ELSE BEGIN MEM[R].HH.RH:=MEM[Q]
.HH.RH;FREENODE(Q,3);END ELSE R:=Q;Q:=MEM[R].HH.RH;END;END;
P:=MEM[P+1].HH.LH;REPEAT R:=P;P:=MEM[P].HH.RH;UNTIL MEM[P+2].HH.LH>=N;
IF MEM[P+2].HH.LH<>N THEN GOTO 10;END;
IF DISCARDSUFFI THEN FLUSHBELOWVA(P)ELSE BEGIN IF MEM[P].HH.B0=21 THEN P
:=MEM[P+1].HH.LH;RECYCLEVALUE(P);END;10:END;{:245}{247:}
FUNCTION UNDTYPE(P:HALFWORD):SMALLNUMBER;
BEGIN CASE MEM[P].HH.B0 OF 0,1:UNDTYPE:=0;2,3:UNDTYPE:=3;4,5:UNDTYPE:=5;
6,7,8:UNDTYPE:=7;9,10:UNDTYPE:=10;11,12:UNDTYPE:=12;
13,14,18:UNDTYPE:=MEM[P].HH.B0;15,16,17,19:UNDTYPE:=18;END;END;{:247}
{248:}PROCEDURE CLEARSYMBOL(P:HALFWORD;SAVING:BOOLEAN);VAR Q:HALFWORD;
BEGIN Q:=EQTB[P].RH;
CASE EQTB[P].LH MOD 83 OF 10,54,44,49:IF NOT SAVING THEN DELETEMACREF(Q)
;
41:IF Q<>0 THEN IF SAVING THEN MEM[Q].HH.B1:=1 ELSE BEGIN FLUSHBELOWVA(Q
);FREENODE(Q,2);END;OTHERS:END;EQTB[P]:=EQTB[2242];END;{:248}{251:}
PROCEDURE SAVEVARIABLE(Q:HALFWORD);VAR P:HALFWORD;
BEGIN IF SAVEPTR<>0 THEN BEGIN P:=GETNODE(2);MEM[P].HH.LH:=Q;
MEM[P].HH.RH:=SAVEPTR;MEM[P+1].HH:=EQTB[Q];SAVEPTR:=P;END;
CLEARSYMBOL(Q,(SAVEPTR<>0));END;{:251}{252:}
PROCEDURE SAVEINTERNAL(Q:HALFWORD);VAR P:HALFWORD;
BEGIN IF SAVEPTR<>0 THEN BEGIN P:=GETNODE(2);MEM[P].HH.LH:=2242+Q;
MEM[P].HH.RH:=SAVEPTR;MEM[P+1].INT:=INTERNAL[Q];SAVEPTR:=P;END;END;
{:252}{253:}PROCEDURE UNSAVE;VAR Q:HALFWORD;P:HALFWORD;
BEGIN WHILE MEM[SAVEPTR].HH.LH<>0 DO BEGIN Q:=MEM[SAVEPTR].HH.LH;
IF Q>2242 THEN BEGIN INTERNAL[Q-(2242)]:=MEM[SAVEPTR+1].INT;
END ELSE BEGIN CLEARSYMBOL(Q,FALSE);EQTB[Q]:=MEM[SAVEPTR+1].HH;
IF EQTB[Q].LH MOD 83=41 THEN BEGIN P:=EQTB[Q].RH;
IF P<>0 THEN MEM[P].HH.B1:=0;END;END;P:=MEM[SAVEPTR].HH.RH;
FREENODE(SAVEPTR,2);SAVEPTR:=P;END;P:=MEM[SAVEPTR].HH.RH;
BEGIN MEM[SAVEPTR].HH.RH:=AVAIL;AVAIL:=SAVEPTR;DYNUSED:=DYNUSED-1;END;
SAVEPTR:=P;END;{:253}{263:}FUNCTION COPYKNOT(P:HALFWORD):HALFWORD;
VAR Q:HALFWORD;K:0..6;BEGIN Q:=GETNODE(7);
FOR K:=0 TO 6 DO MEM[Q+K]:=MEM[P+K];COPYKNOT:=Q;END;{:263}{264:}
FUNCTION COPYPATH(P:HALFWORD):HALFWORD;LABEL 10;VAR Q,PP,QQ:HALFWORD;
BEGIN Q:=GETNODE(7);QQ:=Q;PP:=P;
WHILE TRUE DO BEGIN MEM[QQ].HH.B0:=MEM[PP].HH.B0;
MEM[QQ].HH.B1:=MEM[PP].HH.B1;MEM[QQ+1].INT:=MEM[PP+1].INT;
MEM[QQ+2].INT:=MEM[PP+2].INT;MEM[QQ+3].INT:=MEM[PP+3].INT;
MEM[QQ+4].INT:=MEM[PP+4].INT;MEM[QQ+5].INT:=MEM[PP+5].INT;
MEM[QQ+6].INT:=MEM[PP+6].INT;
IF MEM[PP].HH.RH=P THEN BEGIN MEM[QQ].HH.RH:=Q;COPYPATH:=Q;GOTO 10;END;
MEM[QQ].HH.RH:=GETNODE(7);QQ:=MEM[QQ].HH.RH;PP:=MEM[PP].HH.RH;END;
10:END;{:264}{265:}FUNCTION HTAPYPOC(P:HALFWORD):HALFWORD;LABEL 10;
VAR Q,PP,QQ,RR:HALFWORD;BEGIN Q:=GETNODE(7);QQ:=Q;PP:=P;
WHILE TRUE DO BEGIN MEM[QQ].HH.B1:=MEM[PP].HH.B0;
MEM[QQ].HH.B0:=MEM[PP].HH.B1;MEM[QQ+1].INT:=MEM[PP+1].INT;
MEM[QQ+2].INT:=MEM[PP+2].INT;MEM[QQ+5].INT:=MEM[PP+3].INT;
MEM[QQ+6].INT:=MEM[PP+4].INT;MEM[QQ+3].INT:=MEM[PP+5].INT;
MEM[QQ+4].INT:=MEM[PP+6].INT;
IF MEM[PP].HH.RH=P THEN BEGIN MEM[Q].HH.RH:=QQ;PATHTAIL:=PP;HTAPYPOC:=Q;
GOTO 10;END;RR:=GETNODE(7);MEM[RR].HH.RH:=QQ;QQ:=RR;PP:=MEM[PP].HH.RH;
END;10:END;{:265}{268:}{283:}{295:}
FUNCTION CURLRATIO(GAMMA,ATENSION,BTENSION:SCALED):FRACTION;
VAR ALPHA,BETA,NUM,DENOM,FF:FRACTION;
BEGIN ALPHA:=MAKEFRACTION(65536,ATENSION);
BETA:=MAKEFRACTION(65536,BTENSION);
IF ALPHA<=BETA THEN BEGIN FF:=MAKEFRACTION(ALPHA,BETA);
FF:=TAKEFRACTION(FF,FF);GAMMA:=TAKEFRACTION(GAMMA,FF);
BETA:=BETA DIV 4096;DENOM:=TAKEFRACTION(GAMMA,ALPHA)+196608-BETA;
NUM:=TAKEFRACTION(GAMMA,805306368-ALPHA)+BETA;
END ELSE BEGIN FF:=MAKEFRACTION(BETA,ALPHA);FF:=TAKEFRACTION(FF,FF);
BETA:=TAKEFRACTION(BETA,FF)DIV 4096;
DENOM:=TAKEFRACTION(GAMMA,ALPHA)+(FF DIV 1365)-BETA;
NUM:=TAKEFRACTION(GAMMA,805306368-ALPHA)+BETA;END;
IF NUM>=DENOM+DENOM+DENOM+DENOM THEN CURLRATIO:=1073741824 ELSE
CURLRATIO:=MAKEFRACTION(NUM,DENOM);END;{:295}{298:}
PROCEDURE SETCONTROLS(P,Q:HALFWORD;K:INTEGER);VAR RR,SS:FRACTION;
LT,RT:SCALED;SINE:FRACTION;BEGIN LT:=ABS(MEM[Q+4].INT);
RT:=ABS(MEM[P+6].INT);RR:=VELOCITY(ST,CT,SF,CF,RT);
SS:=VELOCITY(SF,CF,ST,CT,LT);
IF(MEM[P+6].INT<0)OR(MEM[Q+4].INT<0)THEN{299:}
IF((ST>=0)AND(SF>=0))OR((ST<=0)AND(SF<=0))THEN BEGIN SINE:=TAKEFRACTION(
ABS(ST),CF)+TAKEFRACTION(ABS(SF),CT);
IF SINE>0 THEN BEGIN IF MEM[P+6].INT<0 THEN IF ABVSCD(ABS(SF),268435456,
RR,SINE)<0 THEN RR:=MAKEFRACTION(ABS(SF),SINE);
IF MEM[Q+4].INT<0 THEN IF ABVSCD(ABS(ST),268435456,SS,SINE)<0 THEN SS:=
MAKEFRACTION(ABS(ST),SINE);END;END{:299};
MEM[P+5].INT:=MEM[P+1].INT+TAKEFRACTION(TAKEFRACTION(DELTAX[K],CT)-
TAKEFRACTION(DELTAY[K],ST),RR);
MEM[P+6].INT:=MEM[P+2].INT+TAKEFRACTION(TAKEFRACTION(DELTAY[K],CT)+
TAKEFRACTION(DELTAX[K],ST),RR);
MEM[Q+3].INT:=MEM[Q+1].INT-TAKEFRACTION(TAKEFRACTION(DELTAX[K],CF)+
TAKEFRACTION(DELTAY[K],SF),SS);
MEM[Q+4].INT:=MEM[Q+2].INT-TAKEFRACTION(TAKEFRACTION(DELTAY[K],CF)-
TAKEFRACTION(DELTAX[K],SF),SS);MEM[P].HH.B1:=1;MEM[Q].HH.B0:=1;END;
{:298}PROCEDURE SOLVECHOICES(P,Q:HALFWORD;N:HALFWORD);LABEL 40,10;
VAR K:0..PATHSIZE;R,S,T:HALFWORD;SINE,COSINE:FRACTION;{285:}
AA,BB,CC,FF,ACC:FRACTION;DD,EE:SCALED;LT,RT:SCALED;{:285}BEGIN K:=0;
S:=P;WHILE TRUE DO BEGIN T:=MEM[S].HH.RH;IF K=0 THEN{284:}
CASE MEM[S].HH.B1 OF 2:IF MEM[T].HH.B0=2 THEN{300:}
BEGIN AA:=NARG(DELTAX[0],DELTAY[0]);NSINCOS(MEM[P+5].INT-AA);CT:=NCOS;
ST:=NSIN;NSINCOS(MEM[Q+3].INT-AA);CF:=NCOS;SF:=-NSIN;SETCONTROLS(P,Q,0);
GOTO 10;END{:300}ELSE{292:}
BEGIN VV[0]:=MEM[S+5].INT-NARG(DELTAX[0],DELTAY[0]);
IF ABS(VV[0])>188743680 THEN IF VV[0]>0 THEN VV[0]:=VV[0]-377487360 ELSE
VV[0]:=VV[0]+377487360;UU[0]:=0;WW[0]:=0;END{:292};
3:IF MEM[T].HH.B0=3 THEN{301:}BEGIN MEM[P].HH.B1:=1;MEM[Q].HH.B0:=1;
LT:=ABS(MEM[Q+4].INT);RT:=ABS(MEM[P+6].INT);
IF RT=65536 THEN BEGIN IF DELTAX[0]>=0 THEN MEM[P+5].INT:=MEM[P+1].INT+(
(DELTAX[0]+1)DIV 3)ELSE MEM[P+5].INT:=MEM[P+1].INT+((DELTAX[0]-1)DIV 3);
IF DELTAY[0]>=0 THEN MEM[P+6].INT:=MEM[P+2].INT+((DELTAY[0]+1)DIV 3)ELSE
MEM[P+6].INT:=MEM[P+2].INT+((DELTAY[0]-1)DIV 3);
END ELSE BEGIN FF:=MAKEFRACTION(65536,3*RT);
MEM[P+5].INT:=MEM[P+1].INT+TAKEFRACTION(DELTAX[0],FF);
MEM[P+6].INT:=MEM[P+2].INT+TAKEFRACTION(DELTAY[0],FF);END;
IF LT=65536 THEN BEGIN IF DELTAX[0]>=0 THEN MEM[Q+3].INT:=MEM[Q+1].INT-(
(DELTAX[0]+1)DIV 3)ELSE MEM[Q+3].INT:=MEM[Q+1].INT-((DELTAX[0]-1)DIV 3);
IF DELTAY[0]>=0 THEN MEM[Q+4].INT:=MEM[Q+2].INT-((DELTAY[0]+1)DIV 3)ELSE
MEM[Q+4].INT:=MEM[Q+2].INT-((DELTAY[0]-1)DIV 3);
END ELSE BEGIN FF:=MAKEFRACTION(65536,3*LT);
MEM[Q+3].INT:=MEM[Q+1].INT-TAKEFRACTION(DELTAX[0],FF);
MEM[Q+4].INT:=MEM[Q+2].INT-TAKEFRACTION(DELTAY[0],FF);END;GOTO 10;
END{:301}ELSE{293:}BEGIN CC:=MEM[S+5].INT;LT:=ABS(MEM[T+4].INT);
RT:=ABS(MEM[S+6].INT);
IF(RT=65536)AND(LT=65536)THEN UU[0]:=MAKEFRACTION(CC+CC+65536,CC+131072)
ELSE UU[0]:=CURLRATIO(CC,RT,LT);VV[0]:=-TAKEFRACTION(PSI[1],UU[0]);
WW[0]:=0;END{:293};4:BEGIN UU[0]:=0;VV[0]:=0;WW[0]:=268435456;END;
END{:284}ELSE CASE MEM[S].HH.B0 OF 5,4:{286:}BEGIN{287:}
IF ABS(MEM[R+6].INT)=65536 THEN BEGIN AA:=134217728;DD:=2*DELTA[K];
END ELSE BEGIN AA:=MAKEFRACTION(65536,3*ABS(MEM[R+6].INT)-65536);
DD:=TAKEFRACTION(DELTA[K],805306368-MAKEFRACTION(65536,ABS(MEM[R+6].INT)
));END;IF ABS(MEM[T+4].INT)=65536 THEN BEGIN BB:=134217728;
EE:=2*DELTA[K-1];
END ELSE BEGIN BB:=MAKEFRACTION(65536,3*ABS(MEM[T+4].INT)-65536);
EE:=TAKEFRACTION(DELTA[K-1],805306368-MAKEFRACTION(65536,ABS(MEM[T+4].
INT)));END;CC:=268435456-TAKEFRACTION(UU[K-1],AA){:287};{288:}
DD:=TAKEFRACTION(DD,CC);LT:=ABS(MEM[S+4].INT);RT:=ABS(MEM[S+6].INT);
IF LT<>RT THEN IF LT<RT THEN BEGIN FF:=MAKEFRACTION(LT,RT);
FF:=TAKEFRACTION(FF,FF);DD:=TAKEFRACTION(DD,FF);
END ELSE BEGIN FF:=MAKEFRACTION(RT,LT);FF:=TAKEFRACTION(FF,FF);
EE:=TAKEFRACTION(EE,FF);END;FF:=MAKEFRACTION(EE,EE+DD){:288};
UU[K]:=TAKEFRACTION(FF,BB);{289:}ACC:=-TAKEFRACTION(PSI[K+1],UU[K]);
IF MEM[R].HH.B1=3 THEN BEGIN WW[K]:=0;
VV[K]:=ACC-TAKEFRACTION(PSI[1],268435456-FF);
END ELSE BEGIN FF:=MAKEFRACTION(268435456-FF,CC);
ACC:=ACC-TAKEFRACTION(PSI[K],FF);FF:=TAKEFRACTION(FF,AA);
VV[K]:=ACC-TAKEFRACTION(VV[K-1],FF);
IF WW[K-1]=0 THEN WW[K]:=0 ELSE WW[K]:=-TAKEFRACTION(WW[K-1],FF);
END{:289};IF MEM[S].HH.B0=5 THEN{290:}BEGIN AA:=0;BB:=268435456;
REPEAT K:=K-1;IF K=0 THEN K:=N;AA:=VV[K]-TAKEFRACTION(AA,UU[K]);
BB:=WW[K]-TAKEFRACTION(BB,UU[K]);UNTIL K=N;
AA:=MAKEFRACTION(AA,268435456-BB);THETA[N]:=AA;VV[0]:=AA;
FOR K:=1 TO N-1 DO VV[K]:=VV[K]+TAKEFRACTION(AA,WW[K]);GOTO 40;END{:290}
;END{:286};3:{294:}BEGIN CC:=MEM[S+3].INT;LT:=ABS(MEM[S+4].INT);
RT:=ABS(MEM[R+6].INT);
IF(RT=65536)AND(LT=65536)THEN FF:=MAKEFRACTION(CC+CC+65536,CC+131072)
ELSE FF:=CURLRATIO(CC,LT,RT);
THETA[N]:=-MAKEFRACTION(TAKEFRACTION(VV[N-1],FF),268435456-TAKEFRACTION(
FF,UU[N-1]));GOTO 40;END{:294};2:{291:}
BEGIN THETA[N]:=MEM[S+3].INT-NARG(DELTAX[N-1],DELTAY[N-1]);
IF ABS(THETA[N])>188743680 THEN IF THETA[N]>0 THEN THETA[N]:=THETA[N]
-377487360 ELSE THETA[N]:=THETA[N]+377487360;GOTO 40;END{:291};END;R:=S;
S:=T;K:=K+1;END;40:{296:}
FOR K:=N-1 DOWNTO 0 DO THETA[K]:=VV[K]-TAKEFRACTION(THETA[K+1],UU[K]);
S:=P;K:=0;REPEAT T:=MEM[S].HH.RH;NSINCOS(THETA[K]);ST:=NSIN;CT:=NCOS;
NSINCOS(-PSI[K+1]-THETA[K+1]);SF:=NSIN;CF:=NCOS;SETCONTROLS(S,T,K);
K:=K+1;S:=T;UNTIL K=N{:296};10:END;{:283}
PROCEDURE MAKECHOICES(KNOTS:HALFWORD);LABEL 30;VAR H:HALFWORD;
P,Q:HALFWORD;{279:}K,N:0..PATHSIZE;R,S,T:HALFWORD;DELX,DELY:SCALED;
SINE,COSINE:FRACTION;{:279}BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;
END;IF INTERNAL[4]>0 THEN PRINTPATH(KNOTS,394,TRUE);{270:}P:=KNOTS;
REPEAT Q:=MEM[P].HH.RH;
IF MEM[P+1].INT=MEM[Q+1].INT THEN IF MEM[P+2].INT=MEM[Q+2].INT THEN IF
MEM[P].HH.B1>1 THEN BEGIN MEM[P].HH.B1:=1;
IF MEM[P].HH.B0=4 THEN BEGIN MEM[P].HH.B0:=3;MEM[P+3].INT:=65536;END;
MEM[Q].HH.B0:=1;IF MEM[Q].HH.B1=4 THEN BEGIN MEM[Q].HH.B1:=3;
MEM[Q+5].INT:=65536;END;MEM[P+5].INT:=MEM[P+1].INT;
MEM[Q+3].INT:=MEM[P+1].INT;MEM[P+6].INT:=MEM[P+2].INT;
MEM[Q+4].INT:=MEM[P+2].INT;END;P:=Q;UNTIL P=KNOTS{:270};{271:}H:=KNOTS;
WHILE TRUE DO BEGIN IF MEM[H].HH.B0<>4 THEN GOTO 30;
IF MEM[H].HH.B1<>4 THEN GOTO 30;H:=MEM[H].HH.RH;
IF H=KNOTS THEN BEGIN MEM[H].HH.B0:=5;GOTO 30;END;END;30:{:271};P:=H;
REPEAT{272:}Q:=MEM[P].HH.RH;
IF MEM[P].HH.B1>=2 THEN BEGIN WHILE(MEM[Q].HH.B0=4)AND(MEM[Q].HH.B1=4)DO
Q:=MEM[Q].HH.RH;{277:}{280:}K:=0;S:=P;N:=PATHSIZE;
REPEAT T:=MEM[S].HH.RH;DELTAX[K]:=MEM[T+1].INT-MEM[S+1].INT;
DELTAY[K]:=MEM[T+2].INT-MEM[S+2].INT;
DELTA[K]:=PYTHADD(DELTAX[K],DELTAY[K]);
IF K>0 THEN BEGIN SINE:=MAKEFRACTION(DELTAY[K-1],DELTA[K-1]);
COSINE:=MAKEFRACTION(DELTAX[K-1],DELTA[K-1]);
PSI[K]:=NARG(TAKEFRACTION(DELTAX[K],COSINE)+TAKEFRACTION(DELTAY[K],SINE)
,TAKEFRACTION(DELTAY[K],COSINE)-TAKEFRACTION(DELTAX[K],SINE));END;
K:=K+1;S:=T;IF K=PATHSIZE THEN OVERFLOW(399,PATHSIZE);IF S=Q THEN N:=K;
UNTIL(K>=N)AND(MEM[S].HH.B0<>5);
IF K=N THEN PSI[N]:=0 ELSE PSI[K]:=PSI[1]{:280};{281:}
IF MEM[Q].HH.B0=4 THEN BEGIN DELX:=MEM[Q+5].INT-MEM[Q+1].INT;
DELY:=MEM[Q+6].INT-MEM[Q+2].INT;
IF(DELX=0)AND(DELY=0)THEN BEGIN MEM[Q].HH.B0:=3;MEM[Q+3].INT:=65536;
END ELSE BEGIN MEM[Q].HH.B0:=2;MEM[Q+3].INT:=NARG(DELX,DELY);END;END;
IF(MEM[P].HH.B1=4)AND(MEM[P].HH.B0=1)THEN BEGIN DELX:=MEM[P+1].INT-MEM[P
+3].INT;DELY:=MEM[P+2].INT-MEM[P+4].INT;
IF(DELX=0)AND(DELY=0)THEN BEGIN MEM[P].HH.B1:=3;MEM[P+5].INT:=65536;
END ELSE BEGIN MEM[P].HH.B1:=2;MEM[P+5].INT:=NARG(DELX,DELY);END;
END{:281};SOLVECHOICES(P,Q,N){:277};END;P:=Q{:272};UNTIL P=H;
IF INTERNAL[4]>0 THEN PRINTPATH(KNOTS,395,TRUE);IF ARITHERROR THEN{269:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(396);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=397;HELPLINE[0]:=398;END;PUTGETERROR;
ARITHERROR:=FALSE;END{:269};END;{:268}{310:}
PROCEDURE MAKEMOVES(XX0,XX1,XX2,XX3,YY0,YY1,YY2,YY3:SCALED;
XICORR,ETACORR:SMALLNUMBER);LABEL 22,30,10;
VAR X1,X2,X3,M,R,Y1,Y2,Y3,N,S,L:INTEGER;Q,T,U,X2A,X3A,Y2A,Y3A:INTEGER;
BEGIN IF(XX3<XX0)OR(YY3<YY0)THEN CONFUSION(109);L:=16;BISECTPTR:=0;
X1:=XX1-XX0;X2:=XX2-XX1;X3:=XX3-XX2;
IF XX0>=XICORR THEN R:=(XX0-XICORR)MOD 65536 ELSE R:=65535-((-XX0+XICORR
-1)MOD 65536);M:=(XX3-XX0+R)DIV 65536;Y1:=YY1-YY0;Y2:=YY2-YY1;
Y3:=YY3-YY2;
IF YY0>=ETACORR THEN S:=(YY0-ETACORR)MOD 65536 ELSE S:=65535-((-YY0+
ETACORR-1)MOD 65536);N:=(YY3-YY0+S)DIV 65536;
IF(XX3-XX0>=268435456)OR(YY3-YY0>=268435456)THEN{312:}
BEGIN X1:=(X1+XICORR)DIV 2;X2:=(X2+XICORR)DIV 2;X3:=(X3+XICORR)DIV 2;
R:=(R+XICORR)DIV 2;Y1:=(Y1+ETACORR)DIV 2;Y2:=(Y2+ETACORR)DIV 2;
Y3:=(Y3+ETACORR)DIV 2;S:=(S+ETACORR)DIV 2;L:=15;END{:312};
WHILE TRUE DO BEGIN 22:{313:}IF M=0 THEN{314:}
WHILE N>0 DO BEGIN MOVEPTR:=MOVEPTR+1;MOVE[MOVEPTR]:=1;N:=N-1;END{:314}
ELSE IF N=0 THEN{315:}MOVE[MOVEPTR]:=MOVE[MOVEPTR]+M{:315}
ELSE IF M+N=2 THEN{316:}BEGIN R:=TWOTOTHE[L]-R;S:=TWOTOTHE[L]-S;
WHILE L<30 DO BEGIN X3A:=X3;X2A:=(X2+X3+XICORR)DIV 2;
X2:=(X1+X2+XICORR)DIV 2;X3:=(X2+X2A+XICORR)DIV 2;T:=X1+X2+X3;
R:=R+R-XICORR;Y3A:=Y3;Y2A:=(Y2+Y3+ETACORR)DIV 2;
Y2:=(Y1+Y2+ETACORR)DIV 2;Y3:=(Y2+Y2A+ETACORR)DIV 2;U:=Y1+Y2+Y3;
S:=S+S-ETACORR;IF T<R THEN IF U<S THEN{317:}BEGIN X1:=X3;X2:=X2A;
X3:=X3A;R:=R-T;Y1:=Y3;Y2:=Y2A;Y3:=Y3A;S:=S-U;END{:317}ELSE BEGIN{319:}
BEGIN MOVEPTR:=MOVEPTR+1;MOVE[MOVEPTR]:=2;END{:319};GOTO 30;
END ELSE IF U<S THEN BEGIN{318:}BEGIN MOVE[MOVEPTR]:=MOVE[MOVEPTR]+1;
MOVEPTR:=MOVEPTR+1;MOVE[MOVEPTR]:=1;END{:318};GOTO 30;END;L:=L+1;END;
R:=R-XICORR;S:=S-ETACORR;
IF ABVSCD(X1+X2+X3,S,Y1+Y2+Y3,R)-XICORR>=0 THEN{318:}
BEGIN MOVE[MOVEPTR]:=MOVE[MOVEPTR]+1;MOVEPTR:=MOVEPTR+1;
MOVE[MOVEPTR]:=1;END{:318}ELSE{319:}BEGIN MOVEPTR:=MOVEPTR+1;
MOVE[MOVEPTR]:=2;END{:319};30:END{:316}ELSE BEGIN L:=L+1;
BISECTSTACK[BISECTPTR+10]:=L;BISECTSTACK[BISECTPTR+2]:=X3;
BISECTSTACK[BISECTPTR+1]:=(X2+X3+XICORR)DIV 2;X2:=(X1+X2+XICORR)DIV 2;
X3:=(X2+BISECTSTACK[BISECTPTR+1]+XICORR)DIV 2;
BISECTSTACK[BISECTPTR]:=X3;R:=R+R+XICORR;T:=X1+X2+X3+R;
Q:=T DIV TWOTOTHE[L];BISECTSTACK[BISECTPTR+3]:=T MOD TWOTOTHE[L];
BISECTSTACK[BISECTPTR+4]:=M-Q;M:=Q;BISECTSTACK[BISECTPTR+7]:=Y3;
BISECTSTACK[BISECTPTR+6]:=(Y2+Y3+ETACORR)DIV 2;Y2:=(Y1+Y2+ETACORR)DIV 2;
Y3:=(Y2+BISECTSTACK[BISECTPTR+6]+ETACORR)DIV 2;
BISECTSTACK[BISECTPTR+5]:=Y3;S:=S+S+ETACORR;U:=Y1+Y2+Y3+S;
Q:=U DIV TWOTOTHE[L];BISECTSTACK[BISECTPTR+8]:=U MOD TWOTOTHE[L];
BISECTSTACK[BISECTPTR+9]:=N-Q;N:=Q;BISECTPTR:=BISECTPTR+11;GOTO 22;
END{:313};IF BISECTPTR=0 THEN GOTO 10;{311:}BISECTPTR:=BISECTPTR-11;
X1:=BISECTSTACK[BISECTPTR];X2:=BISECTSTACK[BISECTPTR+1];
X3:=BISECTSTACK[BISECTPTR+2];R:=BISECTSTACK[BISECTPTR+3];
M:=BISECTSTACK[BISECTPTR+4];Y1:=BISECTSTACK[BISECTPTR+5];
Y2:=BISECTSTACK[BISECTPTR+6];Y3:=BISECTSTACK[BISECTPTR+7];
S:=BISECTSTACK[BISECTPTR+8];N:=BISECTSTACK[BISECTPTR+9];
L:=BISECTSTACK[BISECTPTR+10]{:311};END;10:END;{:310}{320:}
PROCEDURE SMOOTHMOVES(B,T:INTEGER);VAR K:1..MOVESIZE;A,AA,AAA:INTEGER;
BEGIN IF T-B>=3 THEN BEGIN K:=B+2;AA:=MOVE[K-1];AAA:=MOVE[K-2];
REPEAT A:=MOVE[K];IF ABS(A-AA)>1 THEN{321:}
IF A>AA THEN BEGIN IF AAA>=AA THEN IF A>=MOVE[K+1]THEN BEGIN MOVE[K-1]:=
MOVE[K-1]+1;MOVE[K]:=A-1;END;
END ELSE BEGIN IF AAA<=AA THEN IF A<=MOVE[K+1]THEN BEGIN MOVE[K-1]:=MOVE
[K-1]-1;MOVE[K]:=A+1;END;END{:321};K:=K+1;AAA:=AA;AA:=A;UNTIL K=T;END;
END;{:320}{325:}PROCEDURE INITEDGES(H:HALFWORD);BEGIN MEM[H].HH.LH:=H;
MEM[H].HH.RH:=H;MEM[H+1].HH.LH:=8191;MEM[H+1].HH.RH:=1;
MEM[H+2].HH.LH:=8191;MEM[H+2].HH.RH:=1;MEM[H+3].HH.LH:=4096;
MEM[H+3].HH.RH:=0;MEM[H+4].INT:=0;MEM[H+5].HH.RH:=H;MEM[H+5].HH.LH:=0;
END;{:325}{327:}PROCEDURE FIXOFFSET;VAR P,Q:HALFWORD;DELTA:INTEGER;
BEGIN DELTA:=8*(MEM[CUREDGES+3].HH.LH-4096);MEM[CUREDGES+3].HH.LH:=4096;
Q:=MEM[CUREDGES].HH.RH;WHILE Q<>CUREDGES DO BEGIN P:=MEM[Q+1].HH.RH;
WHILE P<>3000 DO BEGIN MEM[P].HH.LH:=MEM[P].HH.LH-DELTA;P:=MEM[P].HH.RH;
END;P:=MEM[Q+1].HH.LH;
WHILE P>1 DO BEGIN MEM[P].HH.LH:=MEM[P].HH.LH-DELTA;P:=MEM[P].HH.RH;END;
Q:=MEM[Q].HH.RH;END;END;{:327}{328:}
PROCEDURE EDGEPREP(ML,MR,NL,NR:INTEGER);VAR DELTA:HALFWORD;P,Q:HALFWORD;
BEGIN ML:=ML+4096;MR:=MR+4096;NL:=NL+4096;NR:=NR+4095;
IF ML<MEM[CUREDGES+2].HH.LH THEN MEM[CUREDGES+2].HH.LH:=ML;
IF MR>MEM[CUREDGES+2].HH.RH THEN MEM[CUREDGES+2].HH.RH:=MR;
IF NOT(ABS(MEM[CUREDGES+2].HH.LH+MEM[CUREDGES+3].HH.LH-8192)<4096)OR NOT
(ABS(MEM[CUREDGES+2].HH.RH+MEM[CUREDGES+3].HH.LH-8192)<4096)THEN
FIXOFFSET;
IF MEM[CUREDGES].HH.RH=CUREDGES THEN BEGIN MEM[CUREDGES+1].HH.LH:=NR+1;
MEM[CUREDGES+1].HH.RH:=NR;END;IF NL<MEM[CUREDGES+1].HH.LH THEN{329:}
BEGIN DELTA:=MEM[CUREDGES+1].HH.LH-NL;MEM[CUREDGES+1].HH.LH:=NL;
P:=MEM[CUREDGES].HH.RH;REPEAT Q:=GETNODE(2);MEM[Q+1].HH.RH:=3000;
MEM[Q+1].HH.LH:=1;MEM[P].HH.LH:=Q;MEM[Q].HH.RH:=P;P:=Q;DELTA:=DELTA-1;
UNTIL DELTA=0;MEM[P].HH.LH:=CUREDGES;MEM[CUREDGES].HH.RH:=P;
IF MEM[CUREDGES+5].HH.RH=CUREDGES THEN MEM[CUREDGES+5].HH.LH:=NL-1;
END{:329};IF NR>MEM[CUREDGES+1].HH.RH THEN{330:}
BEGIN DELTA:=NR-MEM[CUREDGES+1].HH.RH;MEM[CUREDGES+1].HH.RH:=NR;
P:=MEM[CUREDGES].HH.LH;REPEAT Q:=GETNODE(2);MEM[Q+1].HH.RH:=3000;
MEM[Q+1].HH.LH:=1;MEM[P].HH.RH:=Q;MEM[Q].HH.LH:=P;P:=Q;DELTA:=DELTA-1;
UNTIL DELTA=0;MEM[P].HH.RH:=CUREDGES;MEM[CUREDGES].HH.LH:=P;
IF MEM[CUREDGES+5].HH.RH=CUREDGES THEN MEM[CUREDGES+5].HH.LH:=NR+1;
END{:330};END;{:328}{333:}FUNCTION COPYEDGES(H:HALFWORD):HALFWORD;
VAR P,R:HALFWORD;HH,PP,QQ,RR,SS:HALFWORD;BEGIN HH:=GETNODE(6);
MEM[HH+1]:=MEM[H+1];MEM[HH+2]:=MEM[H+2];MEM[HH+3]:=MEM[H+3];
MEM[HH+4]:=MEM[H+4];MEM[HH+5].HH.LH:=MEM[HH+1].HH.RH+1;
MEM[HH+5].HH.RH:=HH;P:=MEM[H].HH.RH;QQ:=HH;
WHILE P<>H DO BEGIN PP:=GETNODE(2);MEM[QQ].HH.RH:=PP;MEM[PP].HH.LH:=QQ;
{334:}R:=MEM[P+1].HH.RH;RR:=PP+1;WHILE R<>3000 DO BEGIN SS:=GETAVAIL;
MEM[RR].HH.RH:=SS;RR:=SS;MEM[RR].HH.LH:=MEM[R].HH.LH;R:=MEM[R].HH.RH;
END;MEM[RR].HH.RH:=3000;R:=MEM[P+1].HH.LH;RR:=2999;
WHILE R>1 DO BEGIN SS:=GETAVAIL;MEM[RR].HH.RH:=SS;RR:=SS;
MEM[RR].HH.LH:=MEM[R].HH.LH;R:=MEM[R].HH.RH;END;MEM[RR].HH.RH:=R;
MEM[PP+1].HH.LH:=MEM[2999].HH.RH{:334};P:=MEM[P].HH.RH;QQ:=PP;END;
MEM[QQ].HH.RH:=HH;MEM[HH].HH.LH:=QQ;COPYEDGES:=HH;END;{:333}{335:}
PROCEDURE YREFLECTEDGE;VAR P,Q,R:HALFWORD;
BEGIN P:=MEM[CUREDGES+1].HH.LH;
MEM[CUREDGES+1].HH.LH:=8191-MEM[CUREDGES+1].HH.RH;
MEM[CUREDGES+1].HH.RH:=8191-P;
MEM[CUREDGES+5].HH.LH:=8191-MEM[CUREDGES+5].HH.LH;
P:=MEM[CUREDGES].HH.RH;Q:=CUREDGES;REPEAT R:=MEM[P].HH.RH;
MEM[P].HH.RH:=Q;MEM[Q].HH.LH:=P;Q:=P;P:=R;UNTIL Q=CUREDGES;
MEM[CUREDGES+4].INT:=0;END;{:335}{336:}PROCEDURE XREFLECTEDGE;
VAR P,Q,R,S:HALFWORD;M:INTEGER;BEGIN P:=MEM[CUREDGES+2].HH.LH;
MEM[CUREDGES+2].HH.LH:=8192-MEM[CUREDGES+2].HH.RH;
MEM[CUREDGES+2].HH.RH:=8192-P;M:=(4096+MEM[CUREDGES+3].HH.LH)*8+8;
MEM[CUREDGES+3].HH.LH:=4096;P:=MEM[CUREDGES].HH.RH;REPEAT{338:}
Q:=MEM[P+1].HH.RH;R:=3000;WHILE Q<>3000 DO BEGIN S:=MEM[Q].HH.RH;
MEM[Q].HH.RH:=R;R:=Q;MEM[R].HH.LH:=M-MEM[Q].HH.LH;Q:=S;END;
MEM[P+1].HH.RH:=R{:338};{337:}Q:=MEM[P+1].HH.LH;
WHILE Q>1 DO BEGIN MEM[Q].HH.LH:=M-MEM[Q].HH.LH;Q:=MEM[Q].HH.RH;
END{:337};P:=MEM[P].HH.RH;UNTIL P=CUREDGES;MEM[CUREDGES+4].INT:=0;END;
{:336}{339:}PROCEDURE NEGATEEDGES(H:HALFWORD);LABEL 30;
VAR P,Q,R,S,T,U:HALFWORD;BEGIN P:=MEM[H].HH.RH;
WHILE P<>H DO BEGIN Q:=MEM[P+1].HH.LH;
WHILE Q>1 DO BEGIN MEM[Q].HH.LH:=8-2*((0+MEM[Q].HH.LH-0)MOD 8)+MEM[Q].HH
.LH;Q:=MEM[Q].HH.RH;END;Q:=MEM[P+1].HH.RH;
IF Q<>3000 THEN BEGIN REPEAT MEM[Q].HH.LH:=8-2*((0+MEM[Q].HH.LH-0)MOD 8)
+MEM[Q].HH.LH;Q:=MEM[Q].HH.RH;UNTIL Q=3000;{340:}U:=P+1;Q:=MEM[U].HH.RH;
R:=Q;S:=MEM[R].HH.RH;
WHILE TRUE DO IF MEM[S].HH.LH>MEM[R].HH.LH THEN BEGIN MEM[U].HH.RH:=Q;
IF S=3000 THEN GOTO 30;U:=R;Q:=S;R:=Q;S:=MEM[R].HH.RH;
END ELSE BEGIN T:=S;S:=MEM[T].HH.RH;MEM[T].HH.RH:=Q;Q:=T;END;
30:MEM[R].HH.RH:=3000{:340};END;P:=MEM[P].HH.RH;END;MEM[H+4].INT:=0;END;
{:339}{341:}PROCEDURE SORTEDGES(H:HALFWORD);LABEL 30;VAR K:HALFWORD;
P,Q,R,S:HALFWORD;BEGIN R:=MEM[H+1].HH.LH;MEM[H+1].HH.LH:=0;
P:=MEM[R].HH.RH;MEM[R].HH.RH:=3000;MEM[2999].HH.RH:=R;
WHILE P>1 DO BEGIN K:=MEM[P].HH.LH;Q:=2999;REPEAT R:=Q;Q:=MEM[R].HH.RH;
UNTIL K<=MEM[Q].HH.LH;MEM[R].HH.RH:=P;R:=MEM[P].HH.RH;MEM[P].HH.RH:=Q;
P:=R;END;{342:}BEGIN R:=H+1;Q:=MEM[R].HH.RH;P:=MEM[2999].HH.RH;
WHILE TRUE DO BEGIN K:=MEM[P].HH.LH;WHILE K>MEM[Q].HH.LH DO BEGIN R:=Q;
Q:=MEM[R].HH.RH;END;MEM[R].HH.RH:=P;S:=MEM[P].HH.RH;MEM[P].HH.RH:=Q;
IF S=3000 THEN GOTO 30;R:=P;P:=S;END;30:END{:342};END;{:341}{343:}
PROCEDURE CULLEDGES(WLO,WHI,WOUT,WIN:INTEGER);LABEL 30;
VAR P,Q,R,S:HALFWORD;W:INTEGER;D:INTEGER;M:INTEGER;MM:INTEGER;
WW:INTEGER;PREVW:INTEGER;N,MINN,MAXN:HALFWORD;MIND,MAXD:HALFWORD;
BEGIN MIND:=65535;MAXD:=0;MINN:=65535;MAXN:=0;P:=MEM[CUREDGES].HH.RH;
N:=MEM[CUREDGES+1].HH.LH;
WHILE P<>CUREDGES DO BEGIN IF MEM[P+1].HH.LH>1 THEN SORTEDGES(P);
IF MEM[P+1].HH.RH<>3000 THEN{344:}BEGIN R:=2999;Q:=MEM[P+1].HH.RH;WW:=0;
M:=1000000;PREVW:=0;
WHILE TRUE DO BEGIN IF Q=3000 THEN MM:=1000000 ELSE BEGIN D:=0+MEM[Q].HH
.LH-0;MM:=D DIV 8;WW:=WW+(D MOD 8)-4;END;IF MM>M THEN BEGIN{345:}
IF W<>PREVW THEN BEGIN S:=GETAVAIL;MEM[R].HH.RH:=S;
MEM[S].HH.LH:=8*M+4+W-PREVW;R:=S;PREVW:=W;END{:345};
IF Q=3000 THEN GOTO 30;END;M:=MM;
IF WW>=WLO THEN IF WW<=WHI THEN W:=WIN ELSE W:=WOUT ELSE W:=WOUT;
S:=MEM[Q].HH.RH;BEGIN MEM[Q].HH.RH:=AVAIL;AVAIL:=Q;DYNUSED:=DYNUSED-1;
END;Q:=S;END;30:MEM[R].HH.RH:=3000;MEM[P+1].HH.RH:=MEM[2999].HH.RH;
IF R<>2999 THEN{346:}BEGIN IF MINN=65535 THEN MINN:=N;MAXN:=N;
IF MIND>MEM[MEM[2999].HH.RH].HH.LH THEN MIND:=MEM[MEM[2999].HH.RH].HH.LH
;IF MAXD<MEM[R].HH.LH THEN MAXD:=MEM[R].HH.LH;END{:346};END{:344};
P:=MEM[P].HH.RH;N:=N+1;END;{347:}IF MINN>MAXN THEN{348:}
BEGIN P:=MEM[CUREDGES].HH.RH;WHILE P<>CUREDGES DO BEGIN Q:=MEM[P].HH.RH;
FREENODE(P,2);P:=Q;END;INITEDGES(CUREDGES);END{:348}
ELSE BEGIN N:=MEM[CUREDGES+1].HH.LH;MEM[CUREDGES+1].HH.LH:=MINN;
WHILE MINN>N DO BEGIN P:=MEM[CUREDGES].HH.RH;
MEM[CUREDGES].HH.RH:=MEM[P].HH.RH;MEM[MEM[P].HH.RH].HH.LH:=CUREDGES;
FREENODE(P,2);N:=N+1;END;N:=MEM[CUREDGES+1].HH.RH;
MEM[CUREDGES+1].HH.RH:=MAXN;MEM[CUREDGES+5].HH.LH:=MAXN+1;
MEM[CUREDGES+5].HH.RH:=CUREDGES;
WHILE MAXN<N DO BEGIN P:=MEM[CUREDGES].HH.LH;
MEM[CUREDGES].HH.LH:=MEM[P].HH.LH;MEM[MEM[P].HH.LH].HH.RH:=CUREDGES;
FREENODE(P,2);N:=N-1;END;
MEM[CUREDGES+2].HH.LH:=((0+MIND-0)DIV 8)-MEM[CUREDGES+3].HH.LH+4096;
MEM[CUREDGES+2].HH.RH:=((0+MAXD-0)DIV 8)-MEM[CUREDGES+3].HH.LH+4096;
END{:347};MEM[CUREDGES+4].INT:=0;END;{:343}{349:}PROCEDURE XYSWAPEDGES;
LABEL 30;VAR MMAGIC,NMAGIC:INTEGER;P,Q,R,S:HALFWORD;{352:}
MSPREAD:INTEGER;J,JJ:0..MOVESIZE;M,MM:INTEGER;PD,RD:INTEGER;
PM,RM:INTEGER;W:INTEGER;WW:INTEGER;DW:INTEGER;{:352}{358:}
EXTRAS:INTEGER;XW:-3..3;K:INTEGER;{:358}BEGIN{351:}
MSPREAD:=MEM[CUREDGES+2].HH.RH-MEM[CUREDGES+2].HH.LH;
IF MSPREAD>MOVESIZE THEN OVERFLOW(403,MOVESIZE);
FOR J:=0 TO MSPREAD DO MOVE[J]:=3000{:351};{350:}P:=GETNODE(2);
MEM[P+1].HH.RH:=3000;MEM[P+1].HH.LH:=0;MEM[P].HH.LH:=CUREDGES;
MEM[MEM[CUREDGES].HH.RH].HH.LH:=P;P:=GETNODE(2);MEM[P+1].HH.RH:=3000;
MEM[P].HH.LH:=MEM[CUREDGES].HH.LH;{:350};{360:}
MMAGIC:=MEM[CUREDGES+2].HH.LH+MEM[CUREDGES+3].HH.LH-4096;
NMAGIC:=8*MEM[CUREDGES+1].HH.RH+12{:360};REPEAT Q:=MEM[P].HH.LH;
IF MEM[Q+1].HH.LH>1 THEN SORTEDGES(Q);{353:}R:=MEM[P+1].HH.RH;
FREENODE(P,2);P:=R;PD:=0+MEM[P].HH.LH-0;PM:=PD DIV 8;R:=MEM[Q+1].HH.RH;
RD:=0+MEM[R].HH.LH-0;RM:=RD DIV 8;W:=0;
WHILE TRUE DO BEGIN IF PM<RM THEN MM:=PM ELSE MM:=RM;IF W<>0 THEN{357:}
IF M<>MM THEN BEGIN IF MM-MMAGIC>=MOVESIZE THEN CONFUSION(379);
EXTRAS:=(ABS(W)-1)DIV 3;
IF EXTRAS>0 THEN BEGIN IF W>0 THEN XW:=+3 ELSE XW:=-3;WW:=W-EXTRAS*XW;
END ELSE WW:=W;REPEAT J:=M-MMAGIC;
FOR K:=1 TO EXTRAS DO BEGIN S:=GETAVAIL;MEM[S].HH.LH:=NMAGIC+XW;
MEM[S].HH.RH:=MOVE[J];MOVE[J]:=S;END;S:=GETAVAIL;
MEM[S].HH.LH:=NMAGIC+WW;MEM[S].HH.RH:=MOVE[J];MOVE[J]:=S;M:=M+1;
UNTIL M=MM;END{:357};IF PD<RD THEN BEGIN DW:=(PD MOD 8)-4;{355:}
S:=MEM[P].HH.RH;BEGIN MEM[P].HH.RH:=AVAIL;AVAIL:=P;DYNUSED:=DYNUSED-1;
END;P:=S;PD:=0+MEM[P].HH.LH-0;PM:=PD DIV 8{:355};
END ELSE BEGIN IF R=3000 THEN GOTO 30;DW:=-((RD MOD 8)-4);{354:}
R:=MEM[R].HH.RH;RD:=0+MEM[R].HH.LH-0;RM:=RD DIV 8{:354};END;M:=MM;
W:=W+DW;END;30:{:353};P:=Q;NMAGIC:=NMAGIC-8;UNTIL MEM[P].HH.LH=CUREDGES;
FREENODE(P,2);{359:}MOVE[MSPREAD]:=0;J:=0;WHILE MOVE[J]=3000 DO J:=J+1;
IF J=MSPREAD THEN INITEDGES(CUREDGES)ELSE BEGIN MM:=MEM[CUREDGES+2].HH.
LH;MEM[CUREDGES+2].HH.LH:=MEM[CUREDGES+1].HH.LH;
MEM[CUREDGES+2].HH.RH:=MEM[CUREDGES+1].HH.RH+1;
MEM[CUREDGES+3].HH.LH:=4096;JJ:=MSPREAD-1;
WHILE MOVE[JJ]=3000 DO JJ:=JJ-1;MEM[CUREDGES+1].HH.LH:=J+MM;
MEM[CUREDGES+1].HH.RH:=JJ+MM;Q:=CUREDGES;REPEAT P:=GETNODE(2);
MEM[Q].HH.RH:=P;MEM[P].HH.LH:=Q;MEM[P+1].HH.RH:=MOVE[J];
MEM[P+1].HH.LH:=0;J:=J+1;Q:=P;UNTIL J>JJ;MEM[Q].HH.RH:=CUREDGES;
MEM[CUREDGES].HH.LH:=Q;MEM[CUREDGES+5].HH.LH:=MEM[CUREDGES+1].HH.RH+1;
MEM[CUREDGES+5].HH.RH:=CUREDGES;MEM[CUREDGES+4].INT:=0;END;{:359};END;
{:349}{361:}PROCEDURE MERGEEDGES(H:HALFWORD);LABEL 30;
VAR P,Q,R,PP,QQ,RR:HALFWORD;N:INTEGER;K:HALFWORD;DELTA:INTEGER;
BEGIN IF MEM[H].HH.RH<>H THEN BEGIN IF(MEM[H+2].HH.LH<MEM[CUREDGES+2].HH
.LH)OR(MEM[H+2].HH.RH>MEM[CUREDGES+2].HH.RH)OR(MEM[H+1].HH.LH<MEM[
CUREDGES+1].HH.LH)OR(MEM[H+1].HH.RH>MEM[CUREDGES+1].HH.RH)THEN EDGEPREP(
MEM[H+2].HH.LH-4096,MEM[H+2].HH.RH-4096,MEM[H+1].HH.LH-4096,MEM[H+1].HH.
RH-4095);IF MEM[H+3].HH.LH<>MEM[CUREDGES+3].HH.LH THEN{362:}
BEGIN PP:=MEM[H].HH.RH;DELTA:=8*(MEM[CUREDGES+3].HH.LH-MEM[H+3].HH.LH);
REPEAT QQ:=MEM[PP+1].HH.RH;
WHILE QQ<>3000 DO BEGIN MEM[QQ].HH.LH:=MEM[QQ].HH.LH+DELTA;
QQ:=MEM[QQ].HH.RH;END;QQ:=MEM[PP+1].HH.LH;
WHILE QQ>1 DO BEGIN MEM[QQ].HH.LH:=MEM[QQ].HH.LH+DELTA;
QQ:=MEM[QQ].HH.RH;END;PP:=MEM[PP].HH.RH;UNTIL PP=H;END{:362};
N:=MEM[CUREDGES+1].HH.LH;P:=MEM[CUREDGES].HH.RH;PP:=MEM[H].HH.RH;
WHILE N<MEM[H+1].HH.LH DO BEGIN N:=N+1;P:=MEM[P].HH.RH;END;REPEAT{363:}
QQ:=MEM[PP+1].HH.LH;
IF QQ>1 THEN IF MEM[P+1].HH.LH<=1 THEN MEM[P+1].HH.LH:=QQ ELSE BEGIN
WHILE MEM[QQ].HH.RH>1 DO QQ:=MEM[QQ].HH.RH;
MEM[QQ].HH.RH:=MEM[P+1].HH.LH;MEM[P+1].HH.LH:=MEM[PP+1].HH.LH;END;
MEM[PP+1].HH.LH:=0;QQ:=MEM[PP+1].HH.RH;
IF QQ<>3000 THEN BEGIN IF MEM[P+1].HH.LH=1 THEN MEM[P+1].HH.LH:=0;
MEM[PP+1].HH.RH:=3000;R:=P+1;Q:=MEM[R].HH.RH;
IF Q=3000 THEN MEM[P+1].HH.RH:=QQ ELSE WHILE TRUE DO BEGIN K:=MEM[QQ].HH
.LH;WHILE K>MEM[Q].HH.LH DO BEGIN R:=Q;Q:=MEM[R].HH.RH;END;
MEM[R].HH.RH:=QQ;RR:=MEM[QQ].HH.RH;MEM[QQ].HH.RH:=Q;
IF RR=3000 THEN GOTO 30;R:=QQ;QQ:=RR;END;END;30:{:363};
PP:=MEM[PP].HH.RH;P:=MEM[P].HH.RH;UNTIL PP=H;END;END;{:361}{364:}
FUNCTION TOTALWEIGHT(H:HALFWORD):INTEGER;VAR P,Q:HALFWORD;N:INTEGER;
M:0..65535;BEGIN N:=0;P:=MEM[H].HH.RH;
WHILE P<>H DO BEGIN Q:=MEM[P+1].HH.RH;WHILE Q<>3000 DO{365:}
BEGIN M:=0+MEM[Q].HH.LH-0;N:=N-((M MOD 8)-4)*(M DIV 8);Q:=MEM[Q].HH.RH;
END{:365};Q:=MEM[P+1].HH.LH;WHILE Q>1 DO{365:}BEGIN M:=0+MEM[Q].HH.LH-0;
N:=N-((M MOD 8)-4)*(M DIV 8);Q:=MEM[Q].HH.RH;END{:365};P:=MEM[P].HH.RH;
END;TOTALWEIGHT:=N;END;{:364}{367:}PROCEDURE BEGINEDGETRA;
BEGIN PRINTDIAGNOS(404,157,TRUE);PRINT(405);PRINTINT(CURWT);
PRINTCHAR(41);TRACEX:=-4096;END;PROCEDURE TRACEACORNER;
BEGIN IF FILEOFFSET>MAXPRINTLINE-13 THEN PRINTNL(157);PRINTCHAR(40);
PRINTINT(TRACEX);PRINTCHAR(44);PRINTINT(TRACEYY);PRINTCHAR(41);
TRACEY:=TRACEYY;END;PROCEDURE ENDEDGETRACI;
BEGIN IF TRACEX=-4096 THEN PRINTNL(406)ELSE BEGIN TRACEACORNER;
PRINTCHAR(46);END;ENDDIAGNOSTI(TRUE);END;{:367}{368:}
PROCEDURE TRACENEWEDGE(R:HALFWORD;N:INTEGER);VAR D:INTEGER;W:-3..3;
M,N0,N1:INTEGER;BEGIN D:=0+MEM[R].HH.LH-0;W:=(D MOD 8)-4;
M:=(D DIV 8)-MEM[CUREDGES+3].HH.LH;IF W=CURWT THEN BEGIN N0:=N+1;N1:=N;
END ELSE BEGIN N0:=N;N1:=N+1;END;
IF M<>TRACEX THEN BEGIN IF TRACEX=-4096 THEN BEGIN PRINTNL(157);
TRACEYY:=N0;END ELSE IF TRACEYY<>N0 THEN PRINTCHAR(63)ELSE TRACEACORNER;
TRACEX:=M;TRACEACORNER;END ELSE BEGIN IF N0<>TRACEYY THEN PRINTCHAR(33);
IF((N0<N1)AND(TRACEY>TRACEYY))OR((N0>N1)AND(TRACEY<TRACEYY))THEN
TRACEACORNER;END;TRACEYY:=N1;END;{:368}{369:}
PROCEDURE LINEEDGES(X0,Y0,X1,Y1:SCALED);LABEL 30,31;
VAR M0,N0,M1,N1:INTEGER;DELX,DELY:SCALED;YT:SCALED;TX:SCALED;
P,R:HALFWORD;BASE:INTEGER;N:INTEGER;BEGIN N0:=ROUNDUNSCALE(Y0);
N1:=ROUNDUNSCALE(Y1);IF N0<>N1 THEN BEGIN M0:=ROUNDUNSCALE(X0);
M1:=ROUNDUNSCALE(X1);DELX:=X1-X0;DELY:=Y1-Y0;YT:=N0*65536-32768;
Y0:=Y0-YT;Y1:=Y1-YT;IF N0<N1 THEN{370:}
BEGIN BASE:=8*MEM[CUREDGES+3].HH.LH+4-CURWT;
IF M0<=M1 THEN EDGEPREP(M0,M1,N0,N1)ELSE EDGEPREP(M1,M0,N0,N1);{372:}
N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:372};
Y0:=65536-Y0;WHILE TRUE DO BEGIN R:=GETAVAIL;
MEM[R].HH.RH:=MEM[P+1].HH.LH;MEM[P+1].HH.LH:=R;
TX:=TAKEFRACTION(DELX,MAKEFRACTION(Y0,DELY));
IF ABVSCD(DELX,Y0,DELY,TX)<0 THEN TX:=TX-1;
MEM[R].HH.LH:=8*ROUNDUNSCALE(X0+TX)+BASE;Y1:=Y1-65536;
IF INTERNAL[9]>0 THEN TRACENEWEDGE(R,N);IF Y1<65536 THEN GOTO 30;
P:=MEM[P].HH.RH;Y0:=Y0+65536;N:=N+1;END;30:END{:370}ELSE{371:}
BEGIN BASE:=8*MEM[CUREDGES+3].HH.LH+4+CURWT;
IF M0<=M1 THEN EDGEPREP(M0,M1,N1,N0)ELSE EDGEPREP(M1,M0,N1,N0);N0:=N0-1;
{372:}N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:372};
WHILE TRUE DO BEGIN R:=GETAVAIL;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[P+1].HH.LH:=R;TX:=TAKEFRACTION(DELX,MAKEFRACTION(Y0,DELY));
IF ABVSCD(DELX,Y0,DELY,TX)<0 THEN TX:=TX+1;
MEM[R].HH.LH:=8*ROUNDUNSCALE(X0-TX)+BASE;Y1:=Y1+65536;
IF INTERNAL[9]>0 THEN TRACENEWEDGE(R,N);IF Y1>=0 THEN GOTO 31;
P:=MEM[P].HH.LH;Y0:=Y0+65536;N:=N-1;END;31:END{:371};
MEM[CUREDGES+5].HH.RH:=P;MEM[CUREDGES+5].HH.LH:=N+4096;END;END;{:369}
{373:}PROCEDURE MOVETOEDGES(M0,N0,M1,N1:INTEGER);LABEL 60,61,62,63,30;
VAR DELTA:0..MOVESIZE;K:0..MOVESIZE;P,R:HALFWORD;DX:INTEGER;
EDGEANDWEIGH:INTEGER;J:INTEGER;N:INTEGER;SUM:INTEGER;BEGIN DELTA:=N1-N0;
SUM:=MOVE[0];FOR K:=1 TO DELTA DO SUM:=SUM+ABS(MOVE[K]);
IF SUM<>M1-M0 THEN CONFUSION(48);{375:}CASE OCTANT OF 1:BEGIN DX:=8;
EDGEPREP(M0,M1,N0,N1);GOTO 60;END;5:BEGIN DX:=8;EDGEPREP(N0,N1,M0,M1);
GOTO 62;END;6:BEGIN DX:=-8;EDGEPREP(-N1,-N0,M0,M1);N0:=-N0;GOTO 62;END;
2:BEGIN DX:=-8;EDGEPREP(-M1,-M0,N0,N1);M0:=-M0;GOTO 60;END;
4:BEGIN DX:=-8;EDGEPREP(-M1,-M0,-N1,-N0);M0:=-M0;GOTO 61;END;
8:BEGIN DX:=-8;EDGEPREP(-N1,-N0,-M1,-M0);N0:=-N0;GOTO 63;END;
7:BEGIN DX:=8;EDGEPREP(N0,N1,-M1,-M0);GOTO 63;END;3:BEGIN DX:=8;
EDGEPREP(M0,M1,-N1,-N0);GOTO 61;END;END;{:375};60:{376:}{372:}
N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:372};
IF DELTA>0 THEN BEGIN K:=0;
EDGEANDWEIGH:=8*(M0+MEM[CUREDGES+3].HH.LH)+4-CURWT;
REPEAT EDGEANDWEIGH:=EDGEANDWEIGH+DX*MOVE[K];BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[9]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.RH;K:=K+1;N:=N+1;UNTIL K=DELTA;END;
GOTO 30{:376};61:{377:}N0:=-N0-1;{372:}N:=MEM[CUREDGES+5].HH.LH-4096;
P:=MEM[CUREDGES+5].HH.RH;IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;
P:=MEM[P].HH.RH;UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;
UNTIL N=N0{:372};IF DELTA>0 THEN BEGIN K:=0;
EDGEANDWEIGH:=8*(M0+MEM[CUREDGES+3].HH.LH)+4+CURWT;
REPEAT EDGEANDWEIGH:=EDGEANDWEIGH+DX*MOVE[K];BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[9]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.LH;K:=K+1;N:=N-1;UNTIL K=DELTA;END;
GOTO 30{:377};62:{378:}
EDGEANDWEIGH:=8*(N0+MEM[CUREDGES+3].HH.LH)+4-CURWT;N0:=M0;K:=0;{372:}
N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:372};
REPEAT J:=MOVE[K];WHILE J>0 DO BEGIN BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[9]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.RH;J:=J-1;N:=N+1;END;
EDGEANDWEIGH:=EDGEANDWEIGH+DX;K:=K+1;UNTIL K>DELTA;GOTO 30{:378};
63:{379:}EDGEANDWEIGH:=8*(N0+MEM[CUREDGES+3].HH.LH)+4+CURWT;N0:=-M0-1;
K:=0;{372:}N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:372};
REPEAT J:=MOVE[K];WHILE J>0 DO BEGIN BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[9]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.LH;J:=J-1;N:=N-1;END;
EDGEANDWEIGH:=EDGEANDWEIGH+DX;K:=K+1;UNTIL K>DELTA;GOTO 30{:379};
30:MEM[CUREDGES+5].HH.LH:=N+4096;MEM[CUREDGES+5].HH.RH:=P;END;{:373}
{382:}PROCEDURE SKEW(X,Y:SCALED;OCTANT:SMALLNUMBER);
BEGIN CASE OCTANT OF 1:BEGIN CURX:=X-Y;CURY:=Y;END;5:BEGIN CURX:=Y-X;
CURY:=X;END;6:BEGIN CURX:=Y+X;CURY:=-X;END;2:BEGIN CURX:=-X-Y;CURY:=Y;
END;4:BEGIN CURX:=-X+Y;CURY:=-Y;END;8:BEGIN CURX:=-Y+X;CURY:=-X;END;
7:BEGIN CURX:=-Y-X;CURY:=X;END;3:BEGIN CURX:=X+Y;CURY:=-Y;END;END;END;
{:382}{385:}PROCEDURE ABNEGATE(X,Y:SCALED;
OCTANTBEFORE,OCTANTAFTER:SMALLNUMBER);
BEGIN IF ODD(OCTANTBEFORE)=ODD(OCTANTAFTER)THEN CURX:=X ELSE CURX:=-X;
IF(OCTANTBEFORE>2)=(OCTANTAFTER>2)THEN CURY:=Y ELSE CURY:=-Y;END;{:385}
{386:}FUNCTION CROSSINGPOIN(A,B,C:INTEGER):FRACTION;LABEL 10;
VAR D:INTEGER;X,XX,X0,X1,X2:INTEGER;
BEGIN IF A<0 THEN BEGIN CROSSINGPOIN:=0;GOTO 10;END;
IF C>=0 THEN BEGIN IF B>=0 THEN BEGIN CROSSINGPOIN:=268435457;GOTO 10;
END;IF A=0 THEN BEGIN CROSSINGPOIN:=0;GOTO 10;END;
END ELSE IF A=0 THEN IF B<=0 THEN BEGIN CROSSINGPOIN:=0;GOTO 10;END;
{387:}D:=1;X0:=A;X1:=A-B;X2:=B-C;REPEAT X0:=X0+X0;X:=(X1+X2)DIV 2;
IF X1>X0 THEN BEGIN X2:=X;D:=D+D;END ELSE BEGIN XX:=X1+X;
IF XX>X0 THEN BEGIN X2:=X;D:=D+D;END ELSE BEGIN X0:=X0-XX;
IF X<=X0 THEN IF X+X2<=X0 THEN BEGIN CROSSINGPOIN:=268435457;GOTO 10;
END;X1:=X;D:=D+D+1;END;END;UNTIL D>=268435456;
CROSSINGPOIN:=D-268435456{:387};10:END;{:386}{389:}
PROCEDURE PRINTSPEC(S:STRNUMBER);LABEL 45,30;VAR P,Q:HALFWORD;
OCTANT:SMALLNUMBER;BEGIN PRINTDIAGNOS(407,S,TRUE);P:=CURSPEC;
OCTANT:=MEM[P+3].INT;PRINTLN;
UNSKEW(MEM[CURSPEC+1].INT,MEM[CURSPEC+2].INT,OCTANT);
PRINTTWO(CURX,CURY);PRINT(408);WHILE TRUE DO BEGIN{390:}
CASE OCTANT OF 1:PRINT(411);5:PRINT(412);6:PRINT(413);2:PRINT(414);
4:PRINT(415);8:PRINT(416);7:PRINT(417);3:PRINT(418);END;PRINT(419){:390}
;WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;IF MEM[P].HH.B1=0 THEN GOTO 45;
{391:}BEGIN PRINTNL(420);UNSKEW(MEM[P+5].INT,MEM[P+6].INT,OCTANT);
PRINTTWO(CURX,CURY);PRINT(391);UNSKEW(MEM[Q+3].INT,MEM[Q+4].INT,OCTANT);
PRINTTWO(CURX,CURY);PRINTNL(388);
UNSKEW(MEM[Q+1].INT,MEM[Q+2].INT,OCTANT);PRINTTWO(CURX,CURY);PRINT(421);
PRINTINT(MEM[Q].HH.B0-1);END{:391};P:=Q;END;
45:IF Q=CURSPEC THEN GOTO 30;P:=Q;OCTANT:=MEM[P+3].INT;PRINTNL(409);END;
30:PRINTNL(410);ENDDIAGNOSTI(TRUE);END;{:389}{392:}{395:}
PROCEDURE REMOVECUBIC(P:HALFWORD);VAR Q:HALFWORD;BEGIN Q:=MEM[P].HH.RH;
MEM[P].HH.B1:=MEM[Q].HH.B1;MEM[P].HH.RH:=MEM[Q].HH.RH;
MEM[P+1].INT:=MEM[Q+1].INT;MEM[P+2].INT:=MEM[Q+2].INT;
MEM[P+5].INT:=MEM[Q+5].INT;MEM[P+6].INT:=MEM[Q+6].INT;FREENODE(Q,7);END;
{:395}{396:}{401:}PROCEDURE SPLITCUBIC(P:HALFWORD;T:FRACTION;
XQ,YQ:SCALED);VAR V:SCALED;Q,R:HALFWORD;BEGIN Q:=MEM[P].HH.RH;
R:=GETNODE(7);MEM[P].HH.RH:=R;MEM[R].HH.RH:=Q;
MEM[R].HH.B0:=MEM[Q].HH.B0;MEM[R].HH.B1:=MEM[P].HH.B1;
V:=MEM[P+5].INT-TAKEFRACTION(MEM[P+5].INT-MEM[Q+3].INT,T);
MEM[P+5].INT:=MEM[P+1].INT-TAKEFRACTION(MEM[P+1].INT-MEM[P+5].INT,T);
MEM[Q+3].INT:=MEM[Q+3].INT-TAKEFRACTION(MEM[Q+3].INT-XQ,T);
MEM[R+3].INT:=MEM[P+5].INT-TAKEFRACTION(MEM[P+5].INT-V,T);
MEM[R+5].INT:=V-TAKEFRACTION(V-MEM[Q+3].INT,T);
MEM[R+1].INT:=MEM[R+3].INT-TAKEFRACTION(MEM[R+3].INT-MEM[R+5].INT,T);
V:=MEM[P+6].INT-TAKEFRACTION(MEM[P+6].INT-MEM[Q+4].INT,T);
MEM[P+6].INT:=MEM[P+2].INT-TAKEFRACTION(MEM[P+2].INT-MEM[P+6].INT,T);
MEM[Q+4].INT:=MEM[Q+4].INT-TAKEFRACTION(MEM[Q+4].INT-YQ,T);
MEM[R+4].INT:=MEM[P+6].INT-TAKEFRACTION(MEM[P+6].INT-V,T);
MEM[R+6].INT:=V-TAKEFRACTION(V-MEM[Q+4].INT,T);
MEM[R+2].INT:=MEM[R+4].INT-TAKEFRACTION(MEM[R+4].INT-MEM[R+6].INT,T);
END;{:401}PROCEDURE QUADRANTSUBD;LABEL 22,10,40;
VAR P,Q,R,S,PP,QQ:HALFWORD;FIRSTX,FIRSTY:SCALED;
DEL1,DEL2,DEL3,DEL,DMAX:SCALED;T:FRACTION;DESTX,DESTY:SCALED;
BEGIN P:=CURSPEC;FIRSTX:=MEM[CURSPEC+1].INT;FIRSTY:=MEM[CURSPEC+2].INT;
REPEAT 22:Q:=MEM[P].HH.RH;{397:}IF Q=CURSPEC THEN BEGIN DESTX:=FIRSTX;
DESTY:=FIRSTY;END ELSE BEGIN DESTX:=MEM[Q+1].INT;DESTY:=MEM[Q+2].INT;
END;DEL1:=MEM[P+5].INT-MEM[P+1].INT;DEL2:=MEM[Q+3].INT-MEM[P+5].INT;
DEL3:=DESTX-MEM[Q+3].INT;{399:}
IF DEL1<>0 THEN DEL:=DEL1 ELSE IF DEL2<>0 THEN DEL:=DEL2 ELSE DEL:=DEL3;
IF DEL<>0 THEN BEGIN DMAX:=ABS(DEL1);
IF ABS(DEL2)>DMAX THEN DMAX:=ABS(DEL2);
IF ABS(DEL3)>DMAX THEN DMAX:=ABS(DEL3);
WHILE DMAX<134217728 DO BEGIN DMAX:=DMAX+DMAX;DEL1:=DEL1+DEL1;
DEL2:=DEL2+DEL2;DEL3:=DEL3+DEL3;END;END{:399};
IF DEL<>0 THEN BEGIN IF DEL<0 THEN{400:}
BEGIN MEM[P+1].INT:=-MEM[P+1].INT;MEM[P+5].INT:=-MEM[P+5].INT;
MEM[Q+3].INT:=-MEM[Q+3].INT;DEL1:=-DEL1;DEL2:=-DEL2;DEL3:=-DEL3;
DESTX:=-DESTX;MEM[P].HH.B1:=2;END{:400};T:=CROSSINGPOIN(DEL1,DEL2,DEL3);
IF T<268435456 THEN{402:}BEGIN SPLITCUBIC(P,T,DESTX,DESTY);
R:=MEM[P].HH.RH;
IF MEM[R].HH.B1>1 THEN MEM[R].HH.B1:=1 ELSE MEM[R].HH.B1:=2;
IF MEM[R+1].INT<MEM[P+1].INT THEN MEM[R+1].INT:=MEM[P+1].INT;
MEM[R+3].INT:=MEM[R+1].INT;MEM[R+1].INT:=-MEM[R+1].INT;
MEM[R+5].INT:=MEM[R+1].INT;MEM[Q+3].INT:=-MEM[Q+3].INT;DESTX:=-DESTX;
DEL2:=DEL2-TAKEFRACTION(DEL2-DEL3,T);IF DEL2>0 THEN DEL2:=0;
T:=CROSSINGPOIN(0,-DEL2,-DEL3);IF T<268435456 THEN{403:}
BEGIN SPLITCUBIC(R,T,DESTX,DESTY);S:=MEM[R].HH.RH;
IF MEM[S+1].INT<DESTX THEN MEM[S+1].INT:=DESTX;
IF MEM[S+1].INT<MEM[R+1].INT THEN MEM[S+1].INT:=MEM[R+1].INT;
MEM[S].HH.B1:=MEM[P].HH.B1;MEM[S+3].INT:=MEM[S+1].INT;
MEM[S+1].INT:=-MEM[S+1].INT;MEM[S+5].INT:=MEM[S+1].INT;
MEM[Q+3].INT:=-MEM[Q+3].INT;END{:403}
ELSE IF MEM[R+1].INT>DESTX THEN MEM[R+1].INT:=DESTX;END{:402};
END ELSE{398:}BEGIN IF MEM[P+6].INT>MEM[P+2].INT THEN GOTO 40;
IF MEM[P+6].INT=MEM[P+2].INT THEN BEGIN IF MEM[Q+4].INT>MEM[P+2].INT
THEN GOTO 40;
IF MEM[Q+4].INT=MEM[P+2].INT THEN BEGIN IF DESTY>MEM[P+2].INT THEN GOTO
40;IF DESTY=MEM[P+2].INT THEN BEGIN IF Q=P THEN GOTO 10;REMOVECUBIC(P);
IF Q<>CURSPEC THEN GOTO 22;CURSPEC:=P;GOTO 10;END;END;END;{400:}
BEGIN MEM[P+1].INT:=-MEM[P+1].INT;MEM[P+5].INT:=-MEM[P+5].INT;
MEM[Q+3].INT:=-MEM[Q+3].INT;DEL1:=-DEL1;DEL2:=-DEL2;DEL3:=-DEL3;
DESTX:=-DESTX;MEM[P].HH.B1:=2;END{:400};40:END{:398}{:397};{404:}PP:=P;
REPEAT QQ:=MEM[PP].HH.RH;
ABNEGATE(MEM[QQ+1].INT,MEM[QQ+2].INT,MEM[QQ].HH.B1,MEM[PP].HH.B1);
DESTX:=CURX;DESTY:=CURY;DEL1:=MEM[PP+6].INT-MEM[PP+2].INT;
DEL2:=MEM[QQ+4].INT-MEM[PP+6].INT;DEL3:=DESTY-MEM[QQ+4].INT;{399:}
IF DEL1<>0 THEN DEL:=DEL1 ELSE IF DEL2<>0 THEN DEL:=DEL2 ELSE DEL:=DEL3;
IF DEL<>0 THEN BEGIN DMAX:=ABS(DEL1);
IF ABS(DEL2)>DMAX THEN DMAX:=ABS(DEL2);
IF ABS(DEL3)>DMAX THEN DMAX:=ABS(DEL3);
WHILE DMAX<134217728 DO BEGIN DMAX:=DMAX+DMAX;DEL1:=DEL1+DEL1;
DEL2:=DEL2+DEL2;DEL3:=DEL3+DEL3;END;END{:399};
IF DEL<>0 THEN BEGIN IF DEL<0 THEN{405:}
BEGIN MEM[PP+2].INT:=-MEM[PP+2].INT;MEM[PP+6].INT:=-MEM[PP+6].INT;
MEM[QQ+4].INT:=-MEM[QQ+4].INT;DEL1:=-DEL1;DEL2:=-DEL2;DEL3:=-DEL3;
DESTY:=-DESTY;MEM[PP].HH.B1:=MEM[PP].HH.B1+2;END{:405};
T:=CROSSINGPOIN(DEL1,DEL2,DEL3);IF T<268435456 THEN{406:}
BEGIN SPLITCUBIC(PP,T,DESTX,DESTY);R:=MEM[PP].HH.RH;
IF MEM[R].HH.B1>2 THEN MEM[R].HH.B1:=MEM[R].HH.B1-2 ELSE MEM[R].HH.B1:=
MEM[R].HH.B1+2;
IF MEM[R+1].INT>DESTX THEN MEM[R+1].INT:=DESTX ELSE IF MEM[R+1].INT<MEM[
PP+1].INT THEN MEM[R+1].INT:=MEM[PP+1].INT;
IF MEM[R+2].INT<MEM[PP+2].INT THEN MEM[R+2].INT:=MEM[PP+2].INT;
MEM[R+4].INT:=MEM[R+2].INT;MEM[R+2].INT:=-MEM[R+2].INT;
MEM[R+6].INT:=MEM[R+2].INT;MEM[QQ+4].INT:=-MEM[QQ+4].INT;DESTY:=-DESTY;
DEL2:=DEL2-TAKEFRACTION(DEL2-DEL3,T);IF DEL2>0 THEN DEL2:=0;
T:=CROSSINGPOIN(0,-DEL2,-DEL3);IF T<268435456 THEN{407:}
BEGIN SPLITCUBIC(R,T,DESTX,DESTY);S:=MEM[R].HH.RH;
IF MEM[S+1].INT>DESTX THEN MEM[S+1].INT:=DESTX ELSE IF MEM[S+1].INT<MEM[
R+1].INT THEN MEM[S+1].INT:=MEM[R+1].INT;
IF MEM[S+2].INT<DESTY THEN MEM[S+2].INT:=DESTY;
IF MEM[S+2].INT<MEM[R+2].INT THEN MEM[S+2].INT:=MEM[R+2].INT;
MEM[S].HH.B1:=MEM[PP].HH.B1;MEM[S+4].INT:=MEM[S+2].INT;
MEM[S+2].INT:=-MEM[S+2].INT;MEM[S+6].INT:=MEM[S+2].INT;
MEM[QQ+4].INT:=-MEM[QQ+4].INT;END{:407}
ELSE IF MEM[R+2].INT>DESTY THEN MEM[R+2].INT:=DESTY;END{:406};
END ELSE IF NOT ODD(MEM[PP].HH.B1)THEN{405:}
BEGIN MEM[PP+2].INT:=-MEM[PP+2].INT;MEM[PP+6].INT:=-MEM[PP+6].INT;
MEM[QQ+4].INT:=-MEM[QQ+4].INT;DEL1:=-DEL1;DEL2:=-DEL2;DEL3:=-DEL3;
DESTY:=-DESTY;MEM[PP].HH.B1:=MEM[PP].HH.B1+2;END{:405};PP:=QQ;
UNTIL PP=Q{:404};P:=Q;UNTIL P=CURSPEC;10:END;{:396}{408:}
PROCEDURE OCTANTSUBDIV;VAR P,Q,R,S:HALFWORD;
DEL1,DEL2,DEL3,DEL,DMAX:SCALED;T:FRACTION;DESTX,DESTY:SCALED;
BEGIN P:=CURSPEC;REPEAT Q:=MEM[P].HH.RH;
MEM[P+1].INT:=MEM[P+1].INT-MEM[P+2].INT;
MEM[P+5].INT:=MEM[P+5].INT-MEM[P+6].INT;
MEM[Q+3].INT:=MEM[Q+3].INT-MEM[Q+4].INT;{409:}{410:}
IF Q=CURSPEC THEN BEGIN UNSKEW(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q].HH.B1);
SKEW(CURX,CURY,MEM[P].HH.B1);DESTX:=CURX;DESTY:=CURY;
END ELSE BEGIN ABNEGATE(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q].HH.B1,MEM[P].HH
.B1);DESTX:=CURX-CURY;DESTY:=CURY;END;DEL1:=MEM[P+5].INT-MEM[P+1].INT;
DEL2:=MEM[Q+3].INT-MEM[P+5].INT;DEL3:=DESTX-MEM[Q+3].INT{:410};{399:}
IF DEL1<>0 THEN DEL:=DEL1 ELSE IF DEL2<>0 THEN DEL:=DEL2 ELSE DEL:=DEL3;
IF DEL<>0 THEN BEGIN DMAX:=ABS(DEL1);
IF ABS(DEL2)>DMAX THEN DMAX:=ABS(DEL2);
IF ABS(DEL3)>DMAX THEN DMAX:=ABS(DEL3);
WHILE DMAX<134217728 DO BEGIN DMAX:=DMAX+DMAX;DEL1:=DEL1+DEL1;
DEL2:=DEL2+DEL2;DEL3:=DEL3+DEL3;END;END{:399};
IF DEL<>0 THEN BEGIN IF DEL<0 THEN{412:}
BEGIN MEM[P+2].INT:=MEM[P+1].INT+MEM[P+2].INT;
MEM[P+1].INT:=-MEM[P+1].INT;MEM[P+6].INT:=MEM[P+5].INT+MEM[P+6].INT;
MEM[P+5].INT:=-MEM[P+5].INT;MEM[Q+4].INT:=MEM[Q+3].INT+MEM[Q+4].INT;
MEM[Q+3].INT:=-MEM[Q+3].INT;DEL1:=-DEL1;DEL2:=-DEL2;DEL3:=-DEL3;
DESTY:=DESTX+DESTY;DESTX:=-DESTX;MEM[P].HH.B1:=MEM[P].HH.B1+4;END{:412};
T:=CROSSINGPOIN(DEL1,DEL2,DEL3);IF T<268435456 THEN{413:}
BEGIN SPLITCUBIC(P,T,DESTX,DESTY);R:=MEM[P].HH.RH;
IF MEM[R].HH.B1>4 THEN MEM[R].HH.B1:=MEM[R].HH.B1-4 ELSE MEM[R].HH.B1:=
MEM[R].HH.B1+4;
IF MEM[R+2].INT>DESTY THEN MEM[R+2].INT:=DESTY ELSE IF MEM[R+2].INT<MEM[
P+2].INT THEN MEM[R+2].INT:=MEM[P+2].INT;
IF MEM[R+1].INT<MEM[P+1].INT THEN MEM[R+1].INT:=MEM[P+1].INT;
MEM[R+3].INT:=MEM[R+1].INT;MEM[R+2].INT:=MEM[R+2].INT+MEM[R+1].INT;
MEM[R+1].INT:=-MEM[R+1].INT;MEM[R+5].INT:=MEM[R+1].INT;
MEM[R+6].INT:=MEM[R+6].INT-MEM[R+5].INT;
MEM[Q+4].INT:=MEM[Q+4].INT+MEM[Q+3].INT;MEM[Q+3].INT:=-MEM[Q+3].INT;
DESTY:=DESTY+DESTX;DESTX:=-DESTX;DEL2:=DEL2-TAKEFRACTION(DEL2-DEL3,T);
IF DEL2>0 THEN DEL2:=0;T:=CROSSINGPOIN(0,-DEL2,-DEL3);
IF T<268435456 THEN{414:}BEGIN SPLITCUBIC(R,T,DESTX,DESTY);
S:=MEM[R].HH.RH;
IF MEM[S+2].INT>DESTY THEN MEM[S+2].INT:=DESTY ELSE IF MEM[S+2].INT<MEM[
R+2].INT THEN MEM[S+2].INT:=MEM[R+2].INT;
IF MEM[S+1].INT<DESTX THEN MEM[S+1].INT:=DESTX;
IF MEM[S+1].INT<MEM[R+1].INT THEN MEM[S+1].INT:=MEM[R+1].INT;
MEM[S].HH.B1:=MEM[P].HH.B1;MEM[S+3].INT:=MEM[S+1].INT;
MEM[S+2].INT:=MEM[S+2].INT+MEM[S+1].INT;MEM[S+1].INT:=-MEM[S+1].INT;
MEM[S+6].INT:=MEM[S+6].INT-MEM[S+1].INT;MEM[S+5].INT:=MEM[S+1].INT;
MEM[Q+4].INT:=MEM[Q+4].INT+MEM[Q+3].INT;MEM[Q+3].INT:=-MEM[Q+3].INT;
END{:414}ELSE IF MEM[R+1].INT>DESTX THEN MEM[R+1].INT:=DESTX END{:413};
END{:409};P:=Q;UNTIL P=CURSPEC;END;{:408}{415:}PROCEDURE MAKESAFE;
VAR K:0..MAXWIGGLE;ALLSAFE:BOOLEAN;NEXTA:SCALED;DELTAA,DELTAB:SCALED;
BEGIN BEFORE[CURROUNDINGP]:=BEFORE[0];
NODETOROUND[CURROUNDINGP]:=NODETOROUND[0];
REPEAT AFTER[CURROUNDINGP]:=AFTER[0];ALLSAFE:=TRUE;NEXTA:=AFTER[0];
FOR K:=0 TO CURROUNDINGP-1 DO BEGIN DELTAB:=BEFORE[K+1]-BEFORE[K];
IF DELTAB>=0 THEN DELTAA:=AFTER[K+1]-NEXTA ELSE DELTAA:=NEXTA-AFTER[K+1]
;NEXTA:=AFTER[K+1];
IF(DELTAA<0)OR(DELTAA>ABS(DELTAB+DELTAB))THEN BEGIN ALLSAFE:=FALSE;
AFTER[K]:=BEFORE[K];
IF K=CURROUNDINGP-1 THEN AFTER[0]:=BEFORE[0]ELSE AFTER[K+1]:=BEFORE[K+1]
;END;END;UNTIL ALLSAFE;END;{:415}{418:}
PROCEDURE BEFOREANDAFT(B,A:SCALED;P:HALFWORD);
BEGIN IF CURROUNDINGP=MAXROUNDINGP THEN IF MAXROUNDINGP<MAXWIGGLE THEN
MAXROUNDINGP:=MAXROUNDINGP+1 ELSE OVERFLOW(430,MAXWIGGLE);
AFTER[CURROUNDINGP]:=A;BEFORE[CURROUNDINGP]:=B;
NODETOROUND[CURROUNDINGP]:=P;CURROUNDINGP:=CURROUNDINGP+1;END;{:418}
{420:}FUNCTION GOODVAL(B,O:SCALED):SCALED;VAR A:SCALED;BEGIN A:=B+O;
IF A>=0 THEN A:=A-(A MOD CURGRAN)-O ELSE A:=A+(-(A+1)MOD CURGRAN)-
CURGRAN+1-O;IF B-A<A+CURGRAN-B THEN GOODVAL:=A ELSE GOODVAL:=A+CURGRAN;
END;{:420}{421:}FUNCTION COMPROMISE(U,V:SCALED):SCALED;
BEGIN COMPROMISE:=(GOODVAL(U+U,-U-V))DIV 2;END;{:421}{422:}
PROCEDURE XYROUND;VAR P,Q:HALFWORD;B,A:SCALED;PENEDGE:SCALED;
ALPHA:FRACTION;BEGIN CURGRAN:=ABS(INTERNAL[36]);
IF CURGRAN=0 THEN CURGRAN:=65536;P:=CURSPEC;CURROUNDINGP:=0;
REPEAT Q:=MEM[P].HH.RH;{423:}
IF ODD(MEM[P].HH.B1)<>ODD(MEM[Q].HH.B1)THEN BEGIN IF ODD(MEM[Q].HH.B1)
THEN B:=MEM[Q+1].INT ELSE B:=-MEM[Q+1].INT;
IF(ABS(MEM[Q+1].INT-MEM[Q+5].INT)<655)OR(ABS(MEM[Q+1].INT+MEM[Q+3].INT)<
655)THEN{424:}
BEGIN IF CURPEN=3 THEN PENEDGE:=0 ELSE IF CURPATHTYPE=0 THEN PENEDGE:=
COMPROMISE(MEM[MEM[CURPEN+5].HH.RH+2].INT,MEM[MEM[CURPEN+7].HH.RH+2].INT
)ELSE IF ODD(MEM[Q].HH.B1)THEN PENEDGE:=MEM[MEM[CURPEN+7].HH.RH+2].INT
ELSE PENEDGE:=MEM[MEM[CURPEN+5].HH.RH+2].INT;A:=GOODVAL(B,PENEDGE);
END{:424}ELSE A:=B;
IF ABS(A)>MAXALLOWED THEN IF A>0 THEN A:=MAXALLOWED ELSE A:=-MAXALLOWED;
BEFOREANDAFT(B,A,Q);END{:423};P:=Q;UNTIL P=CURSPEC;
IF CURROUNDINGP>0 THEN{425:}BEGIN MAKESAFE;
REPEAT CURROUNDINGP:=CURROUNDINGP-1;
IF(AFTER[CURROUNDINGP]<>BEFORE[CURROUNDINGP])OR(AFTER[CURROUNDINGP+1]<>
BEFORE[CURROUNDINGP+1])THEN BEGIN P:=NODETOROUND[CURROUNDINGP];
IF ODD(MEM[P].HH.B1)THEN BEGIN B:=BEFORE[CURROUNDINGP];
A:=AFTER[CURROUNDINGP];END ELSE BEGIN B:=-BEFORE[CURROUNDINGP];
A:=-AFTER[CURROUNDINGP];END;
IF BEFORE[CURROUNDINGP]=BEFORE[CURROUNDINGP+1]THEN ALPHA:=268435456 ELSE
ALPHA:=MAKEFRACTION(AFTER[CURROUNDINGP+1]-AFTER[CURROUNDINGP],BEFORE[
CURROUNDINGP+1]-BEFORE[CURROUNDINGP]);
REPEAT MEM[P+1].INT:=TAKEFRACTION(ALPHA,MEM[P+1].INT-B)+A;
MEM[P+5].INT:=TAKEFRACTION(ALPHA,MEM[P+5].INT-B)+A;P:=MEM[P].HH.RH;
MEM[P+3].INT:=TAKEFRACTION(ALPHA,MEM[P+3].INT-B)+A;
UNTIL P=NODETOROUND[CURROUNDINGP+1];END;UNTIL CURROUNDINGP=0;END{:425};
P:=CURSPEC;CURROUNDINGP:=0;REPEAT Q:=MEM[P].HH.RH;{426:}
IF(MEM[P].HH.B1>2)<>(MEM[Q].HH.B1>2)THEN BEGIN IF MEM[Q].HH.B1<=2 THEN B
:=MEM[Q+2].INT ELSE B:=-MEM[Q+2].INT;
IF(ABS(MEM[Q+2].INT-MEM[Q+6].INT)<655)OR(ABS(MEM[Q+2].INT+MEM[Q+4].INT)<
655)THEN{427:}
BEGIN IF CURPEN=3 THEN PENEDGE:=0 ELSE IF CURPATHTYPE=0 THEN PENEDGE:=
COMPROMISE(MEM[MEM[CURPEN+2].HH.RH+2].INT,MEM[MEM[CURPEN+1].HH.RH+2].INT
)ELSE IF MEM[Q].HH.B1<=2 THEN PENEDGE:=MEM[MEM[CURPEN+1].HH.RH+2].INT
ELSE PENEDGE:=MEM[MEM[CURPEN+2].HH.RH+2].INT;A:=GOODVAL(B,PENEDGE);
END{:427}ELSE A:=B;
IF ABS(A)>MAXALLOWED THEN IF A>0 THEN A:=MAXALLOWED ELSE A:=-MAXALLOWED;
BEFOREANDAFT(B,A,Q);END{:426};P:=Q;UNTIL P=CURSPEC;
IF CURROUNDINGP>0 THEN{428:}BEGIN MAKESAFE;
REPEAT CURROUNDINGP:=CURROUNDINGP-1;
IF(AFTER[CURROUNDINGP]<>BEFORE[CURROUNDINGP])OR(AFTER[CURROUNDINGP+1]<>
BEFORE[CURROUNDINGP+1])THEN BEGIN P:=NODETOROUND[CURROUNDINGP];
IF MEM[P].HH.B1<=2 THEN BEGIN B:=BEFORE[CURROUNDINGP];
A:=AFTER[CURROUNDINGP];END ELSE BEGIN B:=-BEFORE[CURROUNDINGP];
A:=-AFTER[CURROUNDINGP];END;
IF BEFORE[CURROUNDINGP]=BEFORE[CURROUNDINGP+1]THEN ALPHA:=268435456 ELSE
ALPHA:=MAKEFRACTION(AFTER[CURROUNDINGP+1]-AFTER[CURROUNDINGP],BEFORE[
CURROUNDINGP+1]-BEFORE[CURROUNDINGP]);
REPEAT MEM[P+2].INT:=TAKEFRACTION(ALPHA,MEM[P+2].INT-B)+A;
MEM[P+6].INT:=TAKEFRACTION(ALPHA,MEM[P+6].INT-B)+A;P:=MEM[P].HH.RH;
MEM[P+4].INT:=TAKEFRACTION(ALPHA,MEM[P+4].INT-B)+A;
UNTIL P=NODETOROUND[CURROUNDINGP+1];END;UNTIL CURROUNDINGP=0;END{:428};
END;{:422}{429:}PROCEDURE DIAGROUND;VAR P,Q,PP:HALFWORD;
B,A,BB,AA,D,C,DD,CC:SCALED;PENEDGE:SCALED;ALPHA,BETA:FRACTION;
NEXTA:SCALED;ALLSAFE:BOOLEAN;K:0..MAXWIGGLE;FIRSTX,FIRSTY:SCALED;
BEGIN P:=CURSPEC;CURROUNDINGP:=0;REPEAT Q:=MEM[P].HH.RH;{430:}
IF MEM[P].HH.B1<>MEM[Q].HH.B1 THEN BEGIN IF MEM[Q].HH.B1>4 THEN B:=-MEM[
Q+1].INT ELSE B:=MEM[Q+1].INT;
IF ABS(MEM[Q].HH.B1-MEM[P].HH.B1)=4 THEN IF(ABS(MEM[Q+1].INT-MEM[Q+5].
INT)<655)OR(ABS(MEM[Q+1].INT+MEM[Q+3].INT)<655)THEN{431:}
BEGIN IF CURPEN=3 THEN PENEDGE:=0 ELSE IF CURPATHTYPE=0 THEN{432:}
CASE MEM[Q].HH.B1 OF 1,5:PENEDGE:=COMPROMISE(MEM[MEM[MEM[CURPEN+1].HH.RH
].HH.LH+1].INT,-MEM[MEM[MEM[CURPEN+4].HH.RH].HH.LH+1].INT);
4,8:PENEDGE:=-COMPROMISE(MEM[MEM[MEM[CURPEN+1].HH.RH].HH.LH+1].INT,-MEM[
MEM[MEM[CURPEN+4].HH.RH].HH.LH+1].INT);
6,2:PENEDGE:=COMPROMISE(MEM[MEM[MEM[CURPEN+2].HH.RH].HH.LH+1].INT,-MEM[
MEM[MEM[CURPEN+3].HH.RH].HH.LH+1].INT);
7,3:PENEDGE:=-COMPROMISE(MEM[MEM[MEM[CURPEN+2].HH.RH].HH.LH+1].INT,-MEM[
MEM[MEM[CURPEN+3].HH.RH].HH.LH+1].INT);END{:432}
ELSE IF MEM[Q].HH.B1<=4 THEN PENEDGE:=MEM[MEM[MEM[CURPEN+MEM[Q].HH.B1].
HH.RH].HH.LH+1].INT ELSE PENEDGE:=-MEM[MEM[MEM[CURPEN+MEM[Q].HH.B1].HH.
RH].HH.LH+1].INT;
IF ODD(MEM[Q].HH.B1)THEN A:=GOODVAL(B,PENEDGE+(CURGRAN)DIV 2)ELSE A:=
GOODVAL(B-1,PENEDGE+(CURGRAN)DIV 2);
IF ODD(A-B)THEN IF B>A THEN A:=A+1 ELSE A:=A-1;END{:431}
ELSE A:=B ELSE A:=B;BEFOREANDAFT(B,A,Q);END{:430};P:=Q;UNTIL P=CURSPEC;
IF CURROUNDINGP>0 THEN{433:}BEGIN P:=NODETOROUND[0];
FIRSTX:=MEM[P+1].INT;FIRSTY:=MEM[P+2].INT;{435:}
BEFORE[CURROUNDINGP]:=BEFORE[0];
NODETOROUND[CURROUNDINGP]:=NODETOROUND[0];
REPEAT AFTER[CURROUNDINGP]:=AFTER[0];ALLSAFE:=TRUE;NEXTA:=AFTER[0];
FOR K:=0 TO CURROUNDINGP-1 DO BEGIN A:=NEXTA;B:=BEFORE[K];
NEXTA:=AFTER[K+1];AA:=NEXTA;BB:=BEFORE[K+1];
IF(A<>B)OR(AA<>BB)THEN BEGIN P:=NODETOROUND[K];PP:=NODETOROUND[K+1];
{434:}
IF AA=BB THEN BEGIN IF PP=NODETOROUND[0]THEN UNSKEW(FIRSTX,FIRSTY,MEM[PP
].HH.B1)ELSE UNSKEW(MEM[PP+1].INT,MEM[PP+2].INT,MEM[PP].HH.B1);
SKEW(CURX,CURY,MEM[P].HH.B1);BB:=CURX;AA:=BB;DD:=CURY;CC:=DD;
IF MEM[P].HH.B1>4 THEN BEGIN B:=-B;A:=-A;END;
END ELSE BEGIN IF MEM[P].HH.B1>4 THEN BEGIN BB:=-BB;AA:=-AA;B:=-B;A:=-A;
END;IF PP=NODETOROUND[0]THEN DD:=FIRSTY-BB ELSE DD:=MEM[PP+2].INT-BB;
CC:=DD-(AA-BB)DIV 2;END;D:=MEM[P+2].INT;C:=D-(A-B)DIV 2{:434};
IF(AA<A)OR(CC<C)OR(AA-A>2*(BB-B))OR(CC-C>2*(DD-D))THEN BEGIN ALLSAFE:=
FALSE;AFTER[K]:=BEFORE[K];
IF K=CURROUNDINGP-1 THEN AFTER[0]:=BEFORE[0]ELSE AFTER[K+1]:=BEFORE[K+1]
;END;END;END;UNTIL ALLSAFE{:435};
FOR K:=0 TO CURROUNDINGP-1 DO BEGIN A:=AFTER[K];B:=BEFORE[K];
AA:=AFTER[K+1];BB:=BEFORE[K+1];
IF(A<>B)OR(AA<>BB)THEN BEGIN P:=NODETOROUND[K];PP:=NODETOROUND[K+1];
{434:}
IF AA=BB THEN BEGIN IF PP=NODETOROUND[0]THEN UNSKEW(FIRSTX,FIRSTY,MEM[PP
].HH.B1)ELSE UNSKEW(MEM[PP+1].INT,MEM[PP+2].INT,MEM[PP].HH.B1);
SKEW(CURX,CURY,MEM[P].HH.B1);BB:=CURX;AA:=BB;DD:=CURY;CC:=DD;
IF MEM[P].HH.B1>4 THEN BEGIN B:=-B;A:=-A;END;
END ELSE BEGIN IF MEM[P].HH.B1>4 THEN BEGIN BB:=-BB;AA:=-AA;B:=-B;A:=-A;
END;IF PP=NODETOROUND[0]THEN DD:=FIRSTY-BB ELSE DD:=MEM[PP+2].INT-BB;
CC:=DD-(AA-BB)DIV 2;END;D:=MEM[P+2].INT;C:=D-(A-B)DIV 2{:434};
IF B=BB THEN ALPHA:=268435456 ELSE ALPHA:=MAKEFRACTION(AA-A,BB-B);
IF D=DD THEN BETA:=268435456 ELSE BETA:=MAKEFRACTION(CC-C,DD-D);
REPEAT MEM[P+1].INT:=TAKEFRACTION(ALPHA,MEM[P+1].INT-B)+A;
MEM[P+2].INT:=TAKEFRACTION(BETA,MEM[P+2].INT-D)+C;
MEM[P+5].INT:=TAKEFRACTION(ALPHA,MEM[P+5].INT-B)+A;
MEM[P+6].INT:=TAKEFRACTION(BETA,MEM[P+6].INT-D)+C;P:=MEM[P].HH.RH;
MEM[P+3].INT:=TAKEFRACTION(ALPHA,MEM[P+3].INT-B)+A;
MEM[P+4].INT:=TAKEFRACTION(BETA,MEM[P+4].INT-D)+C;UNTIL P=PP;END;END;
END{:433};END;{:429}{440:}PROCEDURE NEWBOUNDARY(P:HALFWORD;
OCTANT:SMALLNUMBER);VAR Q,R:HALFWORD;BEGIN Q:=MEM[P].HH.RH;
R:=GETNODE(7);MEM[R].HH.RH:=Q;MEM[P].HH.RH:=R;
MEM[R].HH.B0:=MEM[Q].HH.B0;MEM[R+3].INT:=MEM[Q+3].INT;
MEM[R+4].INT:=MEM[Q+4].INT;MEM[R].HH.B1:=0;MEM[Q].HH.B0:=0;
MEM[R+5].INT:=OCTANT;MEM[Q+3].INT:=MEM[Q].HH.B1;
UNSKEW(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q].HH.B1);SKEW(CURX,CURY,OCTANT);
MEM[R+1].INT:=CURX;MEM[R+2].INT:=CURY;END;{:440}
FUNCTION MAKESPEC(H:HALFWORD;SAFETYMARGIN:SCALED;
TRACING:INTEGER):HALFWORD;LABEL 22,30;VAR P,Q,R,S:HALFWORD;K:INTEGER;
CHOPPED:BOOLEAN;{442:}O1,O2:SMALLNUMBER;CLOCKWISE:BOOLEAN;
TURNAROUND:BOOLEAN;DX1,DY1,DX2,DY2:INTEGER;DMAX,DEL:INTEGER;{:442}
BEGIN CURSPEC:=H;IF TRACING>0 THEN PRINTPATH(CURSPEC,422,TRUE);
MAXALLOWED:=268402687-SAFETYMARGIN;{394:}P:=CURSPEC;K:=1;CHOPPED:=FALSE;
REPEAT IF ABS(MEM[P+3].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+3].INT>0 THEN MEM[P+3].INT:=MAXALLOWED ELSE MEM[P+3].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+4].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+4].INT>0 THEN MEM[P+4].INT:=MAXALLOWED ELSE MEM[P+4].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+1].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+1].INT>0 THEN MEM[P+1].INT:=MAXALLOWED ELSE MEM[P+1].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+2].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+2].INT>0 THEN MEM[P+2].INT:=MAXALLOWED ELSE MEM[P+2].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+5].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+5].INT>0 THEN MEM[P+5].INT:=MAXALLOWED ELSE MEM[P+5].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+6].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+6].INT>0 THEN MEM[P+6].INT:=MAXALLOWED ELSE MEM[P+6].INT:=-
MAXALLOWED;END;P:=MEM[P].HH.RH;MEM[P].HH.B0:=K;K:=K+1;UNTIL P=CURSPEC;
IF CHOPPED THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(425);END;BEGIN HELPPTR:=4;HELPLINE[3]:=426;
HELPLINE[2]:=427;HELPLINE[1]:=428;HELPLINE[0]:=429;END;PUTGETERROR;
END{:394};QUADRANTSUBD;IF INTERNAL[35]>0 THEN XYROUND;OCTANTSUBDIV;
IF INTERNAL[35]>65536 THEN DIAGROUND;{436:}P:=CURSPEC;
REPEAT 22:Q:=MEM[P].HH.RH;
IF P<>Q THEN BEGIN IF MEM[P+1].INT=MEM[P+5].INT THEN IF MEM[P+2].INT=MEM
[P+6].INT THEN IF MEM[P+1].INT=MEM[Q+3].INT THEN IF MEM[P+2].INT=MEM[Q+4
].INT THEN BEGIN UNSKEW(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q].HH.B1);
SKEW(CURX,CURY,MEM[P].HH.B1);
IF MEM[P+1].INT=CURX THEN IF MEM[P+2].INT=CURY THEN BEGIN REMOVECUBIC(P)
;IF Q<>CURSPEC THEN GOTO 22;CURSPEC:=P;Q:=P;END;END;END;P:=Q;
UNTIL P=CURSPEC;{:436};{439:}TURNINGNUMBE:=0;P:=CURSPEC;Q:=MEM[P].HH.RH;
REPEAT R:=MEM[Q].HH.RH;IF(MEM[P].HH.B1<>MEM[Q].HH.B1)OR(Q=R)THEN{441:}
BEGIN NEWBOUNDARY(P,MEM[P].HH.B1);S:=MEM[P].HH.RH;TURNAROUND:=FALSE;
O1:=OCTANTNUMBER[MEM[P].HH.B1];O2:=OCTANTNUMBER[MEM[Q].HH.B1];
CASE O2-O1 OF 1,-7,7,-1:GOTO 30;0,2,-6:CLOCKWISE:=FALSE;
3,-5,4,-4,5,-3:{443:}BEGIN{444:}DX1:=MEM[S+1].INT-MEM[S+3].INT;
DY1:=MEM[S+2].INT-MEM[S+4].INT;
IF DX1=0 THEN IF DY1=0 THEN BEGIN DX1:=MEM[S+1].INT-MEM[P+5].INT;
DY1:=MEM[S+2].INT-MEM[P+6].INT;
IF DX1=0 THEN IF DY1=0 THEN BEGIN DX1:=MEM[S+1].INT-MEM[P+1].INT;
DY1:=MEM[S+2].INT-MEM[P+2].INT;END;END;DMAX:=ABS(DX1);
IF ABS(DY1)>DMAX THEN DMAX:=ABS(DY1);
WHILE DMAX<268435456 DO BEGIN DMAX:=DMAX+DMAX;DX1:=DX1+DX1;DY1:=DY1+DY1;
END;DX2:=MEM[Q+5].INT-MEM[Q+1].INT;DY2:=MEM[Q+6].INT-MEM[Q+2].INT;
IF DX2=0 THEN IF DY2=0 THEN BEGIN DX2:=MEM[R+3].INT-MEM[Q+1].INT;
DY2:=MEM[R+4].INT-MEM[Q+2].INT;
IF DX2=0 THEN IF DY2=0 THEN BEGIN IF MEM[R].HH.B1=0 THEN BEGIN CURX:=MEM
[R+1].INT;CURY:=MEM[R+2].INT;
END ELSE BEGIN UNSKEW(MEM[R+1].INT,MEM[R+2].INT,MEM[R].HH.B1);
SKEW(CURX,CURY,MEM[Q].HH.B1);END;DX2:=CURX-MEM[Q+1].INT;
DY2:=CURY-MEM[Q+2].INT;END;END;DMAX:=ABS(DX2);
IF ABS(DY2)>DMAX THEN DMAX:=ABS(DY2);
WHILE DMAX<268435456 DO BEGIN DMAX:=DMAX+DMAX;DX2:=DX2+DX2;DY2:=DY2+DY2;
END{:444};UNSKEW(DX1,DY1,MEM[P].HH.B1);DEL:=PYTHADD(CURX,CURY);
DX1:=MAKEFRACTION(CURX,DEL);DY1:=MAKEFRACTION(CURY,DEL);
UNSKEW(DX2,DY2,MEM[Q].HH.B1);DEL:=PYTHADD(CURX,CURY);
DX2:=MAKEFRACTION(CURX,DEL);DY2:=MAKEFRACTION(CURY,DEL);
DEL:=TAKEFRACTION(DX1,DY2)-TAKEFRACTION(DX2,DY1);
IF DEL>4684844 THEN CLOCKWISE:=FALSE ELSE IF DEL<-4684844 THEN CLOCKWISE
:=TRUE ELSE BEGIN CLOCKWISE:=FALSE;TURNAROUND:=TRUE;END;END{:443};
6,-2:CLOCKWISE:=TRUE;END;{445:}
WHILE TRUE DO BEGIN IF CLOCKWISE THEN IF O1=1 THEN O1:=8 ELSE O1:=O1-1
ELSE IF O1=8 THEN O1:=1 ELSE O1:=O1+1;IF O1=O2 THEN GOTO 30;
NEWBOUNDARY(S,OCTANTCODE[O1]);S:=MEM[S].HH.RH;
MEM[S+3].INT:=MEM[S+5].INT;END{:445};
30:IF Q=R THEN BEGIN Q:=MEM[Q].HH.RH;R:=Q;P:=S;MEM[S].HH.RH:=Q;
MEM[Q+3].INT:=MEM[Q+5].INT;MEM[Q].HH.B0:=0;FREENODE(CURSPEC,7);
CURSPEC:=Q;END;{446:}P:=MEM[P].HH.RH;REPEAT S:=MEM[P].HH.RH;
O1:=OCTANTNUMBER[MEM[P+5].INT];O2:=OCTANTNUMBER[MEM[S+3].INT];
IF ABS(O1-O2)=1 THEN BEGIN IF O2<O1 THEN O2:=O1;
IF ODD(O2)THEN MEM[P+6].INT:=0 ELSE MEM[P+6].INT:=1;
END ELSE BEGIN IF O1=8 THEN TURNINGNUMBE:=TURNINGNUMBE+1 ELSE
TURNINGNUMBE:=TURNINGNUMBE-1;MEM[P+6].INT:=0;END;
MEM[S+4].INT:=MEM[P+6].INT;P:=S;UNTIL P=Q{:446};END{:441};P:=Q;Q:=R;
UNTIL P=CURSPEC;{:439};
WHILE MEM[CURSPEC].HH.B0<>0 DO CURSPEC:=MEM[CURSPEC].HH.RH;
IF TRACING>0 THEN IF INTERNAL[35]<=0 THEN PRINTSPEC(423)ELSE PRINTSPEC(
424);MAKESPEC:=CURSPEC;END;{:392}{450:}PROCEDURE ENDROUND(X,Y:SCALED);
BEGIN Y:=Y+32768-YCORR[OCTANT];X:=X+Y-XCORR[OCTANT];M1:=FLOORUNSCALE(X);
N1:=FLOORUNSCALE(Y);
IF X-65536*M1>=Y-65536*N1+ZCORR[OCTANT]THEN D1:=1 ELSE D1:=0;END;{:450}
{452:}PROCEDURE FILLSPEC(H:HALFWORD);VAR P,Q,R,S:HALFWORD;
BEGIN IF INTERNAL[9]>0 THEN BEGINEDGETRA;P:=H;
REPEAT OCTANT:=MEM[P+3].INT;{453:}Q:=P;
WHILE MEM[Q].HH.B1<>0 DO Q:=MEM[Q].HH.RH{:453};IF Q<>P THEN BEGIN{454:}
ENDROUND(MEM[P+1].INT,MEM[P+2].INT);M0:=M1;N0:=N1;D0:=D1;
ENDROUND(MEM[Q+1].INT,MEM[Q+2].INT){:454};{455:}
IF N1-N0>=MOVESIZE THEN OVERFLOW(403,MOVESIZE);MOVE[0]:=D0;MOVEPTR:=0;
R:=P;REPEAT S:=MEM[R].HH.RH;
MAKEMOVES(MEM[R+1].INT,MEM[R+5].INT,MEM[S+3].INT,MEM[S+1].INT,MEM[R+2].
INT+32768,MEM[R+6].INT+32768,MEM[S+4].INT+32768,MEM[S+2].INT+32768,
XYCORR[OCTANT],YCORR[OCTANT]);R:=S;UNTIL R=Q;
MOVE[MOVEPTR]:=MOVE[MOVEPTR]-D1;
IF INTERNAL[34]>0 THEN SMOOTHMOVES(0,MOVEPTR){:455};
MOVETOEDGES(M0,N0,M1,N1);END;P:=MEM[Q].HH.RH;UNTIL P=H;TOSSKNOTLIST(H);
IF INTERNAL[9]>0 THEN ENDEDGETRACI;END;{:452}{463:}
PROCEDURE DUPOFFSET(W:HALFWORD);VAR R:HALFWORD;BEGIN R:=GETNODE(3);
MEM[R+1].INT:=MEM[W+1].INT;MEM[R+2].INT:=MEM[W+2].INT;
MEM[R].HH.RH:=MEM[W].HH.RH;MEM[MEM[W].HH.RH].HH.LH:=R;MEM[R].HH.LH:=W;
MEM[W].HH.RH:=R;END;{:463}{464:}FUNCTION MAKEPEN(H:HALFWORD):HALFWORD;
LABEL 30,31,45,40;VAR O,OO,K:SMALLNUMBER;P:HALFWORD;Q,R,S,W,HH:HALFWORD;
N:INTEGER;DX,DY:SCALED;MC:SCALED;BEGIN{466:}Q:=H;R:=MEM[Q].HH.RH;
MC:=ABS(MEM[H+1].INT);IF Q=R THEN BEGIN HH:=H;MEM[H].HH.B1:=0;
IF MC<ABS(MEM[H+2].INT)THEN MC:=ABS(MEM[H+2].INT);END ELSE BEGIN O:=0;
HH:=0;WHILE TRUE DO BEGIN S:=MEM[R].HH.RH;
IF MC<ABS(MEM[R+1].INT)THEN MC:=ABS(MEM[R+1].INT);
IF MC<ABS(MEM[R+2].INT)THEN MC:=ABS(MEM[R+2].INT);
DX:=MEM[R+1].INT-MEM[Q+1].INT;DY:=MEM[R+2].INT-MEM[Q+2].INT;
IF DX=0 THEN IF DY=0 THEN GOTO 45;
IF ABVSCD(DX,MEM[S+2].INT-MEM[R+2].INT,DY,MEM[S+1].INT-MEM[R+1].INT)<0
THEN GOTO 45;{467:}
IF DX>0 THEN OCTANT:=1 ELSE IF DX=0 THEN IF DY>0 THEN OCTANT:=1 ELSE
OCTANT:=2 ELSE BEGIN DX:=-DX;OCTANT:=2;END;IF DY<0 THEN BEGIN DY:=-DY;
OCTANT:=OCTANT+2;END ELSE IF DY=0 THEN IF OCTANT>1 THEN OCTANT:=4;
IF DX<DY THEN OCTANT:=OCTANT+4{:467};MEM[Q].HH.B1:=OCTANT;
OO:=OCTANTNUMBER[OCTANT];IF O>OO THEN BEGIN IF HH<>0 THEN GOTO 45;HH:=Q;
END;O:=OO;IF(Q=H)AND(HH<>0)THEN GOTO 30;Q:=R;R:=S;END;30:END{:466};
IF MC>=268402688 THEN GOTO 45;P:=GETNODE(10);Q:=HH;MEM[P+9].INT:=MC;
MEM[P].HH.LH:=0;IF MEM[Q].HH.RH<>Q THEN MEM[P].HH.RH:=1;
FOR K:=1 TO 8 DO{468:}BEGIN OCTANT:=OCTANTCODE[K];N:=0;H:=P+OCTANT;
WHILE TRUE DO BEGIN R:=GETNODE(3);
SKEW(MEM[Q+1].INT,MEM[Q+2].INT,OCTANT);MEM[R+1].INT:=CURX;
MEM[R+2].INT:=CURY;IF N=0 THEN MEM[H].HH.RH:=R ELSE{469:}
IF ODD(K)THEN BEGIN MEM[W].HH.RH:=R;MEM[R].HH.LH:=W;
END ELSE BEGIN MEM[W].HH.LH:=R;MEM[R].HH.RH:=W;END{:469};W:=R;
IF MEM[Q].HH.B1<>OCTANT THEN GOTO 31;Q:=MEM[Q].HH.RH;N:=N+1;END;
31:{470:}R:=MEM[H].HH.RH;IF ODD(K)THEN BEGIN MEM[W].HH.RH:=R;
MEM[R].HH.LH:=W;END ELSE BEGIN MEM[W].HH.LH:=R;MEM[R].HH.RH:=W;
MEM[H].HH.RH:=W;R:=W;END;
IF(MEM[R+2].INT<>MEM[MEM[R].HH.RH+2].INT)OR(N=0)THEN BEGIN DUPOFFSET(R);
N:=N+1;END;R:=MEM[R].HH.LH;
IF MEM[R+1].INT<>MEM[MEM[R].HH.LH+1].INT THEN DUPOFFSET(R)ELSE N:=N-1{:
470};MEM[H].HH.LH:=N;END{:468};GOTO 40;45:P:=3;{465:}
IF MC>=268402688 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(435);END;BEGIN HELPPTR:=2;HELPLINE[1]:=436;
HELPLINE[0]:=437;END;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(438);END;BEGIN HELPPTR:=3;HELPLINE[2]:=439;HELPLINE[1]:=440;
HELPLINE[0]:=437;END;END;PUTGETERROR{:465};
40:IF INTERNAL[6]>0 THEN PRINTPEN(P,434,TRUE);MAKEPEN:=P;END;{:464}
{471:}{473:}FUNCTION TRIVIALKNOT(X,Y:SCALED):HALFWORD;VAR P:HALFWORD;
BEGIN P:=GETNODE(7);MEM[P].HH.B0:=1;MEM[P].HH.B1:=1;MEM[P+1].INT:=X;
MEM[P+3].INT:=X;MEM[P+5].INT:=X;MEM[P+2].INT:=Y;MEM[P+4].INT:=Y;
MEM[P+6].INT:=Y;TRIVIALKNOT:=P;END;{:473}
FUNCTION MAKEPATH(PENHEAD:HALFWORD):HALFWORD;VAR P:HALFWORD;K:1..8;
H:HALFWORD;M,N:INTEGER;W,WW:HALFWORD;BEGIN P:=2999;
FOR K:=1 TO 8 DO BEGIN OCTANT:=OCTANTCODE[K];H:=PENHEAD+OCTANT;
N:=MEM[H].HH.LH;W:=MEM[H].HH.RH;IF NOT ODD(K)THEN W:=MEM[W].HH.LH;
FOR M:=1 TO N+1 DO BEGIN IF ODD(K)THEN WW:=MEM[W].HH.RH ELSE WW:=MEM[W].
HH.LH;
IF(MEM[WW+1].INT<>MEM[W+1].INT)OR(MEM[WW+2].INT<>MEM[W+2].INT)THEN{472:}
BEGIN UNSKEW(MEM[WW+1].INT,MEM[WW+2].INT,OCTANT);
MEM[P].HH.RH:=TRIVIALKNOT(CURX,CURY);P:=MEM[P].HH.RH;END{:472};W:=WW;
END;END;IF P=2999 THEN BEGIN W:=MEM[PENHEAD+1].HH.RH;
P:=TRIVIALKNOT(MEM[W+1].INT+MEM[W+2].INT,MEM[W+2].INT);
MEM[2999].HH.RH:=P;END;MEM[P].HH.RH:=MEM[2999].HH.RH;
MAKEPATH:=MEM[2999].HH.RH;END;{:471}{475:}
PROCEDURE FINDOFFSET(X,Y:SCALED;P:HALFWORD);LABEL 30,10;VAR OCTANT:1..8;
S:-1..+1;N:INTEGER;H,W,WW:HALFWORD;BEGIN{476:}
IF X>0 THEN OCTANT:=1 ELSE IF X=0 THEN IF Y<=0 THEN IF Y=0 THEN BEGIN
CURX:=0;CURY:=0;GOTO 10;
END ELSE OCTANT:=2 ELSE OCTANT:=1 ELSE BEGIN X:=-X;
IF Y=0 THEN OCTANT:=4 ELSE OCTANT:=2;END;
IF Y<0 THEN BEGIN OCTANT:=OCTANT+2;Y:=-Y;END;
IF X>=Y THEN X:=X-Y ELSE BEGIN OCTANT:=OCTANT+4;X:=Y-X;Y:=Y-X;END{:476};
IF ODD(OCTANTNUMBER[OCTANT])THEN S:=-1 ELSE S:=+1;H:=P+OCTANT;
W:=MEM[MEM[H].HH.RH].HH.RH;WW:=MEM[W].HH.RH;N:=MEM[H].HH.LH;
WHILE N>1 DO BEGIN IF ABVSCD(X,MEM[WW+2].INT-MEM[W+2].INT,Y,MEM[WW+1].
INT-MEM[W+1].INT)<>S THEN GOTO 30;W:=WW;WW:=MEM[W].HH.RH;N:=N-1;END;
30:UNSKEW(MEM[W+1].INT,MEM[W+2].INT,OCTANT);10:END;{:475}{478:}{480:}
PROCEDURE SPLITFOROFFS(P:HALFWORD;T:FRACTION);VAR Q:HALFWORD;R:HALFWORD;
BEGIN Q:=MEM[P].HH.RH;SPLITCUBIC(P,T,MEM[Q+1].INT,MEM[Q+2].INT);
R:=MEM[P].HH.RH;
IF MEM[R+2].INT<MEM[P+2].INT THEN MEM[R+2].INT:=MEM[P+2].INT ELSE IF MEM
[R+2].INT>MEM[Q+2].INT THEN MEM[R+2].INT:=MEM[Q+2].INT;
IF MEM[R+1].INT<MEM[P+1].INT THEN MEM[R+1].INT:=MEM[P+1].INT ELSE IF MEM
[R+1].INT>MEM[Q+1].INT THEN MEM[R+1].INT:=MEM[Q+1].INT;END;{:480}{484:}
PROCEDURE FINOFFSETPRE(P:HALFWORD;K:HALFWORD;W:HALFWORD;
X0,X1,X2,Y0,Y1,Y2:INTEGER;RISING:BOOLEAN;N:INTEGER);LABEL 10;
VAR Q,WW:HALFWORD;DU,DV:SCALED;T0,T1,T2:INTEGER;T:FRACTION;S:FRACTION;
V:INTEGER;BEGIN WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;MEM[P].HH.B1:=K;
IF RISING THEN IF K=N THEN GOTO 10 ELSE WW:=MEM[W].HH.RH ELSE IF K=1
THEN GOTO 10 ELSE WW:=MEM[W].HH.LH;{485:}DU:=MEM[WW+1].INT-MEM[W+1].INT;
DV:=MEM[WW+2].INT-MEM[W+2].INT;
IF ABS(DU)>=ABS(DV)THEN BEGIN S:=MAKEFRACTION(DV,DU);
T0:=TAKEFRACTION(X0,S)-Y0;T1:=TAKEFRACTION(X1,S)-Y1;
T2:=TAKEFRACTION(X2,S)-Y2;END ELSE BEGIN S:=MAKEFRACTION(DU,DV);
T0:=X0-TAKEFRACTION(Y0,S);T1:=X1-TAKEFRACTION(Y1,S);
T2:=X2-TAKEFRACTION(Y2,S);END{:485};T:=CROSSINGPOIN(T0,T1,T2);
IF T>=268435456 THEN GOTO 10;{486:}BEGIN SPLITFOROFFS(P,T);
MEM[P].HH.B1:=K;P:=MEM[P].HH.RH;V:=X0-TAKEFRACTION(X0-X1,T);
X1:=X1-TAKEFRACTION(X1-X2,T);X0:=V-TAKEFRACTION(V-X1,T);
V:=Y0-TAKEFRACTION(Y0-Y1,T);Y1:=Y1-TAKEFRACTION(Y1-Y2,T);
Y0:=V-TAKEFRACTION(V-Y1,T);T1:=T1-TAKEFRACTION(T1-T2,T);
IF T1>0 THEN T1:=0;T:=CROSSINGPOIN(0,-T1,-T2);
IF T<268435456 THEN BEGIN SPLITFOROFFS(P,T);MEM[MEM[P].HH.RH].HH.B1:=K;
V:=X1-TAKEFRACTION(X1-X2,T);X1:=X0-TAKEFRACTION(X0-X1,T);
X2:=X1-TAKEFRACTION(X1-V,T);V:=Y1-TAKEFRACTION(Y1-Y2,T);
Y1:=Y0-TAKEFRACTION(Y0-Y1,T);Y2:=Y1-TAKEFRACTION(Y1-V,T);END;END{:486};
IF RISING THEN K:=K+1 ELSE K:=K-1;W:=WW;END;10:END;{:484}
PROCEDURE OFFSETPREP(C,H:HALFWORD);LABEL 30,45;VAR N:HALFWORD;
P,Q,R,LH,WW:HALFWORD;K:HALFWORD;W:HALFWORD;{482:}
X0,X1,X2,Y0,Y1,Y2:INTEGER;T0,T1,T2:INTEGER;DU,DV,DX,DY:INTEGER;
MAXCOEF:INTEGER;X0A,X1A,X2A,Y0A,Y1A,Y2A:INTEGER;T:FRACTION;S:FRACTION;
{:482}BEGIN P:=C;N:=MEM[H].HH.LH;LH:=MEM[H].HH.RH;
WHILE MEM[P].HH.B1<>0 DO BEGIN Q:=MEM[P].HH.RH;{481:}
IF N<=1 THEN MEM[P].HH.B1:=1 ELSE BEGIN{483:}
X0:=MEM[P+5].INT-MEM[P+1].INT;X2:=MEM[Q+1].INT-MEM[Q+3].INT;
X1:=MEM[Q+3].INT-MEM[P+5].INT;Y0:=MEM[P+6].INT-MEM[P+2].INT;
Y2:=MEM[Q+2].INT-MEM[Q+4].INT;Y1:=MEM[Q+4].INT-MEM[P+6].INT;
MAXCOEF:=ABS(X0);IF ABS(X1)>MAXCOEF THEN MAXCOEF:=ABS(X1);
IF ABS(X2)>MAXCOEF THEN MAXCOEF:=ABS(X2);
IF ABS(Y0)>MAXCOEF THEN MAXCOEF:=ABS(Y0);
IF ABS(Y1)>MAXCOEF THEN MAXCOEF:=ABS(Y1);
IF ABS(Y2)>MAXCOEF THEN MAXCOEF:=ABS(Y2);IF MAXCOEF=0 THEN GOTO 45;
WHILE MAXCOEF<268435456 DO BEGIN MAXCOEF:=MAXCOEF+MAXCOEF;X0:=X0+X0;
X1:=X1+X1;X2:=X2+X2;Y0:=Y0+Y0;Y1:=Y1+Y1;Y2:=Y2+Y2;END;{:483};{488:}
DX:=X0;DY:=Y0;IF DX=0 THEN IF DY=0 THEN BEGIN DX:=X1;DY:=Y1;
IF DX=0 THEN IF DY=0 THEN BEGIN DX:=X2;DY:=Y2;END;END{:488};
IF DX=0 THEN{492:}
FINOFFSETPRE(P,N,MEM[MEM[LH].HH.LH].HH.LH,-X0,-X1,-X2,-Y0,-Y1,-Y2,FALSE,
N){:492}ELSE BEGIN{489:}K:=1;W:=MEM[LH].HH.RH;
WHILE TRUE DO BEGIN IF K=N THEN GOTO 30;WW:=MEM[W].HH.RH;
IF ABVSCD(DY,ABS(MEM[WW+1].INT-MEM[W+1].INT),DX,ABS(MEM[WW+2].INT-MEM[W
+2].INT))>=0 THEN BEGIN K:=K+1;W:=WW;END ELSE GOTO 30;END;30:{:489};
{490:}IF K=1 THEN T:=268435457 ELSE BEGIN WW:=MEM[W].HH.LH;{485:}
DU:=MEM[WW+1].INT-MEM[W+1].INT;DV:=MEM[WW+2].INT-MEM[W+2].INT;
IF ABS(DU)>=ABS(DV)THEN BEGIN S:=MAKEFRACTION(DV,DU);
T0:=TAKEFRACTION(X0,S)-Y0;T1:=TAKEFRACTION(X1,S)-Y1;
T2:=TAKEFRACTION(X2,S)-Y2;END ELSE BEGIN S:=MAKEFRACTION(DU,DV);
T0:=X0-TAKEFRACTION(Y0,S);T1:=X1-TAKEFRACTION(Y1,S);
T2:=X2-TAKEFRACTION(Y2,S);END{:485};T:=CROSSINGPOIN(-T0,-T1,-T2);END;
IF T>=268435456 THEN FINOFFSETPRE(P,K,W,X0,X1,X2,Y0,Y1,Y2,TRUE,N)ELSE
BEGIN SPLITFOROFFS(P,T);R:=MEM[P].HH.RH;X1A:=X0-TAKEFRACTION(X0-X1,T);
X1:=X1-TAKEFRACTION(X1-X2,T);X2A:=X1A-TAKEFRACTION(X1A-X1,T);
Y1A:=Y0-TAKEFRACTION(Y0-Y1,T);Y1:=Y1-TAKEFRACTION(Y1-Y2,T);
Y2A:=Y1A-TAKEFRACTION(Y1A-Y1,T);
FINOFFSETPRE(P,K,W,X0,X1A,X2A,Y0,Y1A,Y2A,TRUE,N);X0:=X2A;Y0:=Y2A;
T1:=T1-TAKEFRACTION(T1-T2,T);IF T1<0 THEN T1:=0;
T:=CROSSINGPOIN(0,T1,T2);IF T<268435456 THEN{491:}
BEGIN SPLITFOROFFS(R,T);X1A:=X1-TAKEFRACTION(X1-X2,T);
X1:=X0-TAKEFRACTION(X0-X1,T);X0A:=X1-TAKEFRACTION(X1-X1A,T);
Y1A:=Y1-TAKEFRACTION(Y1-Y2,T);Y1:=Y0-TAKEFRACTION(Y0-Y1,T);
Y0A:=Y1-TAKEFRACTION(Y1-Y1A,T);
FINOFFSETPRE(MEM[R].HH.RH,K,W,X0A,X1A,X2,Y0A,Y1A,Y2,TRUE,N);X2:=X0A;
Y2:=Y0A;END{:491};
FINOFFSETPRE(R,K-1,WW,-X0,-X1,-X2,-Y0,-Y1,-Y2,FALSE,N);END{:490};END;
45:END{:481};{479:}REPEAT R:=MEM[P].HH.RH;
IF MEM[P+1].INT=MEM[P+5].INT THEN IF MEM[P+2].INT=MEM[P+6].INT THEN IF
MEM[P+1].INT=MEM[R+3].INT THEN IF MEM[P+2].INT=MEM[R+4].INT THEN IF MEM[
P+1].INT=MEM[R+1].INT THEN IF MEM[P+2].INT=MEM[R+2].INT THEN BEGIN
REMOVECUBIC(P);IF R=Q THEN Q:=P;R:=P;END;P:=R;UNTIL P=Q{:479};END;END;
{:478}{493:}{497:}PROCEDURE SKEWLINEEDGE(P,W,WW:HALFWORD);
VAR X0,Y0,X1,Y1:SCALED;
BEGIN IF(MEM[W+1].INT<>MEM[WW+1].INT)OR(MEM[W+2].INT<>MEM[WW+2].INT)THEN
BEGIN X0:=MEM[P+1].INT+MEM[W+1].INT;Y0:=MEM[P+2].INT+MEM[W+2].INT;
X1:=MEM[P+1].INT+MEM[WW+1].INT;Y1:=MEM[P+2].INT+MEM[WW+2].INT;
UNSKEW(X0,Y0,OCTANT);X0:=CURX;Y0:=CURY;UNSKEW(X1,Y1,OCTANT);
IF INTERNAL[9]>65536 THEN BEGIN PRINTNL(446);PRINTTWO(X0,Y0);PRINT(445);
PRINTTWO(CURX,CURY);PRINTNL(157);END;LINEEDGES(X0,Y0,CURX,CURY);END;END;
{:497}{505:}PROCEDURE DUALMOVES(H,P,Q:HALFWORD);LABEL 30,31;
VAR R,S:HALFWORD;{498:}M,N:INTEGER;MM0,MM1:INTEGER;K:INTEGER;
W,WW:HALFWORD;SMOOTHBOT,SMOOTHTOP:0..MOVESIZE;
XX,YY,XP,YP,DELX,DELY,TX,TY:SCALED;{:498}BEGIN{506:}K:=MEM[H].HH.LH+1;
WW:=MEM[H].HH.RH;W:=MEM[WW].HH.LH;
MM0:=FLOORUNSCALE(MEM[P+1].INT+MEM[W+1].INT-XYCORR[OCTANT]);
MM1:=FLOORUNSCALE(MEM[Q+1].INT+MEM[WW+1].INT-XYCORR[OCTANT]);
FOR N:=1 TO N1-N0+1 DO ENVMOVE[N]:=MM1;ENVMOVE[0]:=MM0;MOVEPTR:=0;
M:=MM0{:506};R:=P;WHILE TRUE DO BEGIN IF R=Q THEN SMOOTHTOP:=MOVEPTR;
WHILE MEM[R].HH.B1<>K DO{508:}BEGIN XX:=MEM[R+1].INT+MEM[W+1].INT;
YY:=MEM[R+2].INT+MEM[W+2].INT+32768;
IF INTERNAL[9]>65536 THEN BEGIN PRINTNL(447);PRINTINT(K);PRINT(448);
UNSKEW(XX,YY-32768,OCTANT);PRINTTWO(CURX,CURY);END;
IF MEM[R].HH.B1<K THEN BEGIN K:=K-1;W:=MEM[W].HH.LH;
XP:=MEM[R+1].INT+MEM[W+1].INT;YP:=MEM[R+2].INT+MEM[W+2].INT+32768;
IF YP<>YY THEN{509:}BEGIN TY:=FLOORSCALED(YY-YCORR[OCTANT]);DELY:=YP-YY;
YY:=YY-TY;TY:=YP-YCORR[OCTANT]-TY;IF TY>=65536 THEN BEGIN DELX:=XP-XX;
YY:=65536-YY;
WHILE TRUE DO BEGIN IF M<ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;
TX:=TAKEFRACTION(DELX,MAKEFRACTION(YY,DELY));
IF ABVSCD(TX,DELY,DELX,YY)+XYCORR[OCTANT]>0 THEN TX:=TX-1;
M:=FLOORUNSCALE(XX+TX);TY:=TY-65536;MOVEPTR:=MOVEPTR+1;
IF TY<65536 THEN GOTO 31;YY:=YY+65536;END;
31:IF M<ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;END;END{:509};
END ELSE BEGIN K:=K+1;W:=MEM[W].HH.RH;XP:=MEM[R+1].INT+MEM[W+1].INT;
YP:=MEM[R+2].INT+MEM[W+2].INT+32768;END;
IF INTERNAL[9]>65536 THEN BEGIN PRINT(445);UNSKEW(XP,YP-32768,OCTANT);
PRINTTWO(CURX,CURY);PRINTNL(157);END;M:=FLOORUNSCALE(XP-XYCORR[OCTANT]);
MOVEPTR:=FLOORUNSCALE(YP-YCORR[OCTANT])-N0;
IF M<ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;END{:508};
IF R=P THEN SMOOTHBOT:=MOVEPTR;IF R=Q THEN GOTO 30;MOVE[MOVEPTR]:=1;
N:=MOVEPTR;S:=MEM[R].HH.RH;
MAKEMOVES(MEM[R+1].INT+MEM[W+1].INT,MEM[R+5].INT+MEM[W+1].INT,MEM[S+3].
INT+MEM[W+1].INT,MEM[S+1].INT+MEM[W+1].INT,MEM[R+2].INT+MEM[W+2].INT
+32768,MEM[R+6].INT+MEM[W+2].INT+32768,MEM[S+4].INT+MEM[W+2].INT+32768,
MEM[S+2].INT+MEM[W+2].INT+32768,XYCORR[OCTANT],YCORR[OCTANT]);{507:}
REPEAT IF M<ENVMOVE[N]THEN ENVMOVE[N]:=M;M:=M+MOVE[N]-1;N:=N+1;
UNTIL N>MOVEPTR{:507};R:=S;END;30:{510:}
IF(M<>MM1)OR(MOVEPTR<>N1-N0)THEN CONFUSION(50);
MOVE[0]:=D0+ENVMOVE[1]-MM0;
FOR N:=1 TO MOVEPTR DO MOVE[N]:=ENVMOVE[N+1]-ENVMOVE[N]+1;
MOVE[MOVEPTR]:=MOVE[MOVEPTR]-D1;
IF INTERNAL[34]>0 THEN SMOOTHMOVES(SMOOTHBOT,SMOOTHTOP);
MOVETOEDGES(M0,N0,M1,N1);IF MEM[Q+6].INT=1 THEN BEGIN W:=MEM[H].HH.RH;
SKEWLINEEDGE(Q,W,MEM[W].HH.LH);END{:510};END;{:505}
PROCEDURE FILLENVELOPE(SPECHEAD:HALFWORD);LABEL 30,31;
VAR P,Q,R,S:HALFWORD;H:HALFWORD;WWW:HALFWORD;{498:}M,N:INTEGER;
MM0,MM1:INTEGER;K:INTEGER;W,WW:HALFWORD;SMOOTHBOT,SMOOTHTOP:0..MOVESIZE;
XX,YY,XP,YP,DELX,DELY,TX,TY:SCALED;{:498}
BEGIN IF INTERNAL[9]>0 THEN BEGINEDGETRA;P:=SPECHEAD;
REPEAT OCTANT:=MEM[P+3].INT;H:=CURPEN+OCTANT;{453:}Q:=P;
WHILE MEM[Q].HH.B1<>0 DO Q:=MEM[Q].HH.RH{:453};{495:}W:=MEM[H].HH.RH;
IF MEM[P+4].INT=1 THEN W:=MEM[W].HH.LH;IF INTERNAL[9]>65536 THEN{496:}
BEGIN PRINTNL(441);PRINTINT(OCTANTNUMBER[OCTANT]);PRINT(442);
PRINTINT(MEM[H].HH.LH);PRINT(443);
IF MEM[H].HH.LH<>1 THEN PRINTCHAR(115);PRINT(444);
UNSKEW(MEM[P+1].INT+MEM[W+1].INT,MEM[P+2].INT+MEM[W+2].INT,OCTANT);
PRINTTWO(CURX,CURY);WW:=MEM[H].HH.RH;
IF MEM[Q+6].INT=1 THEN WW:=MEM[WW].HH.LH;PRINT(445);
UNSKEW(MEM[Q+1].INT+MEM[WW+1].INT,MEM[Q+2].INT+MEM[WW+2].INT,OCTANT);
PRINTTWO(CURX,CURY);END{:496};WW:=MEM[H].HH.RH;WWW:=WW;
IF ODD(OCTANTNUMBER[OCTANT])THEN WWW:=MEM[WWW].HH.LH ELSE WW:=MEM[WW].HH
.LH;IF W<>WW THEN SKEWLINEEDGE(P,W,WW);
ENDROUND(MEM[P+1].INT+MEM[WW+1].INT,MEM[P+2].INT+MEM[WW+2].INT);M0:=M1;
N0:=N1;D0:=D1;
ENDROUND(MEM[Q+1].INT+MEM[WWW+1].INT,MEM[Q+2].INT+MEM[WWW+2].INT);
IF N1-N0>=MOVESIZE THEN OVERFLOW(403,MOVESIZE){:495};OFFSETPREP(P,H);
{453:}Q:=P;WHILE MEM[Q].HH.B1<>0 DO Q:=MEM[Q].HH.RH{:453};{499:}
IF ODD(OCTANTNUMBER[OCTANT])THEN BEGIN{500:}K:=0;W:=MEM[H].HH.RH;
WW:=MEM[W].HH.LH;
MM0:=FLOORUNSCALE(MEM[P+1].INT+MEM[W+1].INT-XYCORR[OCTANT]);
MM1:=FLOORUNSCALE(MEM[Q+1].INT+MEM[WW+1].INT-XYCORR[OCTANT]);
FOR N:=0 TO N1-N0 DO ENVMOVE[N]:=MM0;ENVMOVE[N1-N0]:=MM1;MOVEPTR:=0;
M:=MM0{:500};R:=P;MEM[Q].HH.B1:=MEM[H].HH.LH+1;
WHILE TRUE DO BEGIN IF R=Q THEN SMOOTHTOP:=MOVEPTR;
WHILE MEM[R].HH.B1<>K DO{502:}BEGIN XX:=MEM[R+1].INT+MEM[W+1].INT;
YY:=MEM[R+2].INT+MEM[W+2].INT+32768;
IF INTERNAL[9]>65536 THEN BEGIN PRINTNL(447);PRINTINT(K);PRINT(448);
UNSKEW(XX,YY-32768,OCTANT);PRINTTWO(CURX,CURY);END;
IF MEM[R].HH.B1>K THEN BEGIN K:=K+1;W:=MEM[W].HH.RH;
XP:=MEM[R+1].INT+MEM[W+1].INT;YP:=MEM[R+2].INT+MEM[W+2].INT+32768;
IF YP<>YY THEN{503:}BEGIN TY:=FLOORSCALED(YY-YCORR[OCTANT]);DELY:=YP-YY;
YY:=YY-TY;TY:=YP-YCORR[OCTANT]-TY;IF TY>=65536 THEN BEGIN DELX:=XP-XX;
YY:=65536-YY;
WHILE TRUE DO BEGIN TX:=TAKEFRACTION(DELX,MAKEFRACTION(YY,DELY));
IF ABVSCD(TX,DELY,DELX,YY)+XYCORR[OCTANT]>0 THEN TX:=TX-1;
M:=FLOORUNSCALE(XX+TX);IF M>ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;
TY:=TY-65536;IF TY<65536 THEN GOTO 31;YY:=YY+65536;MOVEPTR:=MOVEPTR+1;
END;31:END;END{:503};END ELSE BEGIN K:=K-1;W:=MEM[W].HH.LH;
XP:=MEM[R+1].INT+MEM[W+1].INT;YP:=MEM[R+2].INT+MEM[W+2].INT+32768;END;
IF INTERNAL[9]>65536 THEN BEGIN PRINT(445);UNSKEW(XP,YP-32768,OCTANT);
PRINTTWO(CURX,CURY);PRINTNL(157);END;M:=FLOORUNSCALE(XP-XYCORR[OCTANT]);
MOVEPTR:=FLOORUNSCALE(YP-YCORR[OCTANT])-N0;
IF M>ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;END{:502};
IF R=P THEN SMOOTHBOT:=MOVEPTR;IF R=Q THEN GOTO 30;MOVE[MOVEPTR]:=1;
N:=MOVEPTR;S:=MEM[R].HH.RH;
MAKEMOVES(MEM[R+1].INT+MEM[W+1].INT,MEM[R+5].INT+MEM[W+1].INT,MEM[S+3].
INT+MEM[W+1].INT,MEM[S+1].INT+MEM[W+1].INT,MEM[R+2].INT+MEM[W+2].INT
+32768,MEM[R+6].INT+MEM[W+2].INT+32768,MEM[S+4].INT+MEM[W+2].INT+32768,
MEM[S+2].INT+MEM[W+2].INT+32768,XYCORR[OCTANT],YCORR[OCTANT]);{501:}
REPEAT M:=M+MOVE[N]-1;IF M>ENVMOVE[N]THEN ENVMOVE[N]:=M;N:=N+1;
UNTIL N>MOVEPTR{:501};R:=S;END;30:{504:}
IF(M<>MM1)OR(MOVEPTR<>N1-N0)THEN CONFUSION(49);
MOVE[0]:=D0+ENVMOVE[0]-MM0;
FOR N:=1 TO MOVEPTR DO MOVE[N]:=ENVMOVE[N]-ENVMOVE[N-1]+1;
MOVE[MOVEPTR]:=MOVE[MOVEPTR]-D1;
IF INTERNAL[34]>0 THEN SMOOTHMOVES(SMOOTHBOT,SMOOTHTOP);
MOVETOEDGES(M0,N0,M1,N1);IF MEM[Q+6].INT=0 THEN BEGIN W:=MEM[H].HH.RH;
SKEWLINEEDGE(Q,MEM[W].HH.LH,W);END{:504};END ELSE DUALMOVES(H,P,Q);
MEM[Q].HH.B1:=0{:499};P:=MEM[Q].HH.RH;UNTIL P=SPECHEAD;
IF INTERNAL[9]>0 THEN ENDEDGETRACI;TOSSKNOTLIST(SPECHEAD);END;{:493}
{514:}FUNCTION MAKEELLIPSE(MAJORAXIS,MINORAXIS:SCALED;
THETA:ANGLE):HALFWORD;LABEL 30,31,40;VAR P,Q,R,S:HALFWORD;H:HALFWORD;
ALPHA,BETA,GAMMA,DELTA:INTEGER;C,D:INTEGER;U,V:INTEGER;
SYMMETRIC:BOOLEAN;BEGIN{515:}{517:}
IF(MAJORAXIS=MINORAXIS)OR(THETA MOD 94371840=0)THEN BEGIN SYMMETRIC:=
TRUE;ALPHA:=0;IF ODD(THETA DIV 94371840)THEN BEGIN BETA:=MAJORAXIS;
GAMMA:=MINORAXIS;NSIN:=268435456;NCOS:=0;END ELSE BEGIN BETA:=MINORAXIS;
GAMMA:=MAJORAXIS;END;END ELSE BEGIN SYMMETRIC:=FALSE;NSINCOS(THETA);
GAMMA:=TAKEFRACTION(MAJORAXIS,NSIN);DELTA:=TAKEFRACTION(MINORAXIS,NCOS);
BETA:=PYTHADD(GAMMA,DELTA);
ALPHA:=TAKEFRACTION(TAKEFRACTION(MAJORAXIS,MAKEFRACTION(GAMMA,BETA)),
NCOS)-TAKEFRACTION(TAKEFRACTION(MINORAXIS,MAKEFRACTION(DELTA,BETA)),NSIN
);ALPHA:=(ALPHA+32768)DIV 65536;
GAMMA:=PYTHADD(TAKEFRACTION(MAJORAXIS,NCOS),TAKEFRACTION(MINORAXIS,NSIN)
);END;BETA:=(BETA+32768)DIV 65536;GAMMA:=(GAMMA+32768)DIV 65536{:517};
P:=GETNODE(7);Q:=GETNODE(7);R:=GETNODE(7);
IF SYMMETRIC THEN S:=0 ELSE S:=GETNODE(7);H:=P;MEM[P].HH.RH:=Q;
MEM[Q].HH.RH:=R;MEM[R].HH.RH:=S;{516:}IF BETA=0 THEN BETA:=1;
IF GAMMA=0 THEN GAMMA:=1;
IF GAMMA<=ABS(ALPHA)THEN IF ALPHA>0 THEN ALPHA:=GAMMA-1 ELSE ALPHA:=1-
GAMMA{:516};MEM[P+1].INT:=-ALPHA*32768;MEM[P+2].INT:=-BETA*32768;
MEM[Q+1].INT:=GAMMA*32768;MEM[Q+2].INT:=MEM[P+2].INT;
MEM[R+1].INT:=MEM[Q+1].INT;MEM[P+5].INT:=0;MEM[Q+3].INT:=-32768;
MEM[Q+5].INT:=32768;MEM[R+3].INT:=0;MEM[R+5].INT:=0;MEM[P+6].INT:=BETA;
MEM[Q+6].INT:=GAMMA;MEM[R+6].INT:=BETA;MEM[Q+4].INT:=GAMMA+ALPHA;
IF SYMMETRIC THEN BEGIN MEM[R+2].INT:=0;MEM[R+4].INT:=BETA;
END ELSE BEGIN MEM[R+2].INT:=-MEM[P+2].INT;MEM[R+4].INT:=BETA+BETA;
MEM[S+1].INT:=-MEM[P+1].INT;MEM[S+2].INT:=MEM[R+2].INT;
MEM[S+3].INT:=32768;MEM[S+4].INT:=GAMMA-ALPHA;END{:515};{518:}
WHILE TRUE DO BEGIN U:=MEM[P+5].INT+MEM[Q+5].INT;
V:=MEM[Q+3].INT+MEM[R+3].INT;C:=MEM[P+6].INT+MEM[Q+6].INT;{520:}
DELTA:=PYTHADD(U,V);
IF MAJORAXIS=MINORAXIS THEN D:=MAJORAXIS ELSE BEGIN IF THETA=0 THEN
BEGIN ALPHA:=U;BETA:=V;
END ELSE BEGIN ALPHA:=TAKEFRACTION(U,NCOS)+TAKEFRACTION(V,NSIN);
BETA:=TAKEFRACTION(V,NCOS)-TAKEFRACTION(U,NSIN);END;
ALPHA:=MAKEFRACTION(ALPHA,DELTA);BETA:=MAKEFRACTION(BETA,DELTA);
D:=PYTHADD(TAKEFRACTION(MAJORAXIS,ALPHA),TAKEFRACTION(MINORAXIS,BETA));
END;D:=TAKEFRACTION((D+4)DIV 8,DELTA);
IF ABS(U)>=ABS(V)THEN ALPHA:=ABS(U)DIV 32768 ELSE ALPHA:=ABS(V)DIV 32768
;IF D<ALPHA THEN D:=ALPHA{:520};DELTA:=C-D;
IF DELTA>0 THEN BEGIN IF DELTA>MEM[R+4].INT THEN DELTA:=MEM[R+4].INT;
IF DELTA>=MEM[Q+4].INT THEN{521:}BEGIN DELTA:=MEM[Q+4].INT;
MEM[P+6].INT:=C-DELTA;MEM[P+5].INT:=U;MEM[Q+3].INT:=V;
MEM[Q+1].INT:=MEM[Q+1].INT-DELTA*MEM[R+3].INT;
MEM[Q+2].INT:=MEM[Q+2].INT+DELTA*MEM[Q+5].INT;
MEM[R+4].INT:=MEM[R+4].INT-DELTA;END{:521}ELSE{522:}BEGIN S:=GETNODE(7);
MEM[P].HH.RH:=S;MEM[S].HH.RH:=Q;
MEM[S+1].INT:=MEM[Q+1].INT+DELTA*MEM[Q+3].INT;
MEM[S+2].INT:=MEM[Q+2].INT-DELTA*MEM[P+5].INT;
MEM[Q+1].INT:=MEM[Q+1].INT-DELTA*MEM[R+3].INT;
MEM[Q+2].INT:=MEM[Q+2].INT+DELTA*MEM[Q+5].INT;
MEM[S+3].INT:=MEM[Q+3].INT;MEM[S+5].INT:=U;MEM[Q+3].INT:=V;
MEM[S+6].INT:=C-DELTA;MEM[S+4].INT:=MEM[Q+4].INT-DELTA;
MEM[Q+4].INT:=DELTA;MEM[R+4].INT:=MEM[R+4].INT-DELTA;END{:522};
END ELSE P:=Q;{519:}WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;
IF Q=0 THEN GOTO 30;
IF MEM[Q+4].INT=0 THEN BEGIN MEM[P].HH.RH:=MEM[Q].HH.RH;
MEM[P+6].INT:=MEM[Q+6].INT;MEM[P+5].INT:=MEM[Q+5].INT;FREENODE(Q,7);
END ELSE BEGIN R:=MEM[Q].HH.RH;IF R=0 THEN GOTO 30;
IF MEM[R+4].INT=0 THEN BEGIN MEM[P].HH.RH:=R;FREENODE(Q,7);P:=R;
END ELSE GOTO 40;END;END;40:{:519};END;30:{:518};IF SYMMETRIC THEN{523:}
BEGIN S:=0;Q:=H;WHILE TRUE DO BEGIN R:=GETNODE(7);MEM[R].HH.RH:=S;S:=R;
MEM[S+1].INT:=MEM[Q+1].INT;MEM[S+2].INT:=-MEM[Q+2].INT;
IF Q=P THEN GOTO 31;Q:=MEM[Q].HH.RH;IF MEM[Q+2].INT=0 THEN GOTO 31;END;
31:MEM[P].HH.RH:=S;BETA:=-MEM[H+2].INT;
WHILE MEM[P+2].INT<>BETA DO P:=MEM[P].HH.RH;Q:=MEM[P].HH.RH;END{:523};
{524:}IF Q<>0 THEN BEGIN IF MEM[H+5].INT=0 THEN BEGIN P:=H;
H:=MEM[H].HH.RH;FREENODE(P,7);MEM[Q+1].INT:=-MEM[H+1].INT;END;P:=Q;
END ELSE Q:=P;R:=MEM[H].HH.RH;REPEAT S:=GETNODE(7);MEM[P].HH.RH:=S;P:=S;
MEM[P+1].INT:=-MEM[R+1].INT;MEM[P+2].INT:=-MEM[R+2].INT;R:=MEM[R].HH.RH;
UNTIL R=Q;MEM[P].HH.RH:=H{:524};MAKEELLIPSE:=H;END;{:514}{526:}
FUNCTION FINDDIRECTIO(X,Y:SCALED;H:HALFWORD):SCALED;LABEL 10,40,45,30;
VAR MAX:SCALED;P,Q:HALFWORD;N:SCALED;TT:SCALED;{529:}
X1,X2,X3,Y1,Y2,Y3:SCALED;THETA,PHI:ANGLE;T:FRACTION;{:529}BEGIN{527:}
IF ABS(X)<ABS(Y)THEN BEGIN X:=MAKEFRACTION(X,ABS(Y));
IF Y>0 THEN Y:=268435456 ELSE Y:=-268435456;
END ELSE IF X=0 THEN BEGIN FINDDIRECTIO:=0;GOTO 10;
END ELSE BEGIN Y:=MAKEFRACTION(Y,ABS(X));
IF X>0 THEN X:=268435456 ELSE X:=-268435456;END{:527};N:=0;P:=H;
WHILE TRUE DO BEGIN IF MEM[P].HH.B1=0 THEN GOTO 45;Q:=MEM[P].HH.RH;
{528:}TT:=0;{530:}X1:=MEM[P+5].INT-MEM[P+1].INT;
X2:=MEM[Q+3].INT-MEM[P+5].INT;X3:=MEM[Q+1].INT-MEM[Q+3].INT;
Y1:=MEM[P+6].INT-MEM[P+2].INT;Y2:=MEM[Q+4].INT-MEM[P+6].INT;
Y3:=MEM[Q+2].INT-MEM[Q+4].INT;MAX:=ABS(X1);
IF ABS(X2)>MAX THEN MAX:=ABS(X2);IF ABS(X3)>MAX THEN MAX:=ABS(X3);
IF ABS(Y1)>MAX THEN MAX:=ABS(Y1);IF ABS(Y2)>MAX THEN MAX:=ABS(Y2);
IF ABS(Y3)>MAX THEN MAX:=ABS(Y3);IF MAX=0 THEN GOTO 40;
WHILE MAX<134217728 DO BEGIN MAX:=MAX+MAX;X1:=X1+X1;X2:=X2+X2;X3:=X3+X3;
Y1:=Y1+Y1;Y2:=Y2+Y2;Y3:=Y3+Y3;END;T:=X1;
X1:=TAKEFRACTION(X1,X)+TAKEFRACTION(Y1,Y);
Y1:=TAKEFRACTION(Y1,X)-TAKEFRACTION(T,Y);T:=X2;
X2:=TAKEFRACTION(X2,X)+TAKEFRACTION(Y2,Y);
Y2:=TAKEFRACTION(Y2,X)-TAKEFRACTION(T,Y);T:=X3;
X3:=TAKEFRACTION(X3,X)+TAKEFRACTION(Y3,Y);
Y3:=TAKEFRACTION(Y3,X)-TAKEFRACTION(T,Y){:530};
IF Y1=0 THEN IF X1>=0 THEN GOTO 40;IF N>0 THEN BEGIN{531:}
THETA:=NARG(X1,Y1);
IF THETA>=0 THEN IF PHI<=0 THEN IF PHI>=THETA-188743680 THEN GOTO 40;
IF THETA<=0 THEN IF PHI>=0 THEN IF PHI<=THETA+188743680 THEN GOTO 40{:
531};IF P=H THEN GOTO 45;END;PHI:=NARG(X3,Y3);{533:}
IF X1<0 THEN IF X2<0 THEN IF X3<0 THEN GOTO 30;
IF ABVSCD(Y1,Y3,Y2,Y2)=0 THEN{535:}
BEGIN IF ABVSCD(Y1,Y2,0,0)<0 THEN BEGIN T:=MAKEFRACTION(Y1,Y1-Y2);
X1:=X1-TAKEFRACTION(X1-X2,T);X2:=X2-TAKEFRACTION(X2-X3,T);
IF X1-TAKEFRACTION(X1-X2,T)>=0 THEN BEGIN TT:=(T+2048)DIV 4096;GOTO 40;
END;END ELSE IF Y1=0 THEN IF Y3=0 THEN{536:}
BEGIN T:=CROSSINGPOIN(-X1,-X2,-X3);
IF T<=268435456 THEN BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;
IF ABVSCD(X1,X3,X2,X2)<=0 THEN BEGIN T:=MAKEFRACTION(X1,X1-X2);
BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;END;END{:536};GOTO 30;END{:535};
IF Y1<=0 THEN IF Y1<0 THEN BEGIN Y1:=-Y1;Y2:=-Y2;Y3:=-Y3;
END ELSE IF Y2>0 THEN BEGIN Y2:=-Y2;Y3:=-Y3;END;{534:}
T:=CROSSINGPOIN(Y1,Y2,Y3);IF T>268435456 THEN GOTO 30;
Y2:=Y2-TAKEFRACTION(Y2-Y3,T);X1:=X1-TAKEFRACTION(X1-X2,T);
X2:=X2-TAKEFRACTION(X2-X3,T);X1:=X1-TAKEFRACTION(X1-X2,T);
IF X1>=0 THEN BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;IF Y2>0 THEN Y2:=0;
TT:=T;T:=CROSSINGPOIN(0,-Y2,-Y3);IF T>268435456 THEN GOTO 30;
X1:=X1-TAKEFRACTION(X1-X2,T);X2:=X2-TAKEFRACTION(X2-X3,T);
IF X1-TAKEFRACTION(X1-X2,T)>=0 THEN BEGIN T:=TT-TAKEFRACTION(TT
-268435456,T);BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;END{:534};30:{:533}
{:528};P:=Q;N:=N+65536;END;45:FINDDIRECTIO:=-65536;GOTO 10;
40:FINDDIRECTIO:=N+TT;10:END;{:526}{542:}
PROCEDURE CUBICINTERSE(P,PP:HALFWORD);LABEL 22,45,10;VAR Q,QQ:HALFWORD;
BEGIN TIMETOGO:=5000;{544:}Q:=MEM[P].HH.RH;QQ:=MEM[PP].HH.RH;
BISECTPTR:=20;BISECTSTACK[BISECTPTR-5]:=MEM[P+5].INT-MEM[P+1].INT;
BISECTSTACK[BISECTPTR-4]:=MEM[Q+3].INT-MEM[P+5].INT;
BISECTSTACK[BISECTPTR-3]:=MEM[Q+1].INT-MEM[Q+3].INT;
IF BISECTSTACK[BISECTPTR-5]<0 THEN IF BISECTSTACK[BISECTPTR-3]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-4]<0 THEN BISECTSTACK[BISECTPTR-2]:=
BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-3]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-4]>0 THEN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[
BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;END;
BISECTSTACK[BISECTPTR-10]:=MEM[P+6].INT-MEM[P+2].INT;
BISECTSTACK[BISECTPTR-9]:=MEM[Q+4].INT-MEM[P+6].INT;
BISECTSTACK[BISECTPTR-8]:=MEM[Q+2].INT-MEM[Q+4].INT;
IF BISECTSTACK[BISECTPTR-10]<0 THEN IF BISECTSTACK[BISECTPTR-8]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-9]<0 THEN BISECTSTACK[BISECTPTR-7]:=
BISECTSTACK[BISECTPTR-10]+BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-8]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-9]>0 THEN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[
BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;END;
BISECTSTACK[BISECTPTR-15]:=MEM[PP+5].INT-MEM[PP+1].INT;
BISECTSTACK[BISECTPTR-14]:=MEM[QQ+3].INT-MEM[PP+5].INT;
BISECTSTACK[BISECTPTR-13]:=MEM[QQ+1].INT-MEM[QQ+3].INT;
IF BISECTSTACK[BISECTPTR-15]<0 THEN IF BISECTSTACK[BISECTPTR-13]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-14]<0 THEN BISECTSTACK[BISECTPTR-12]:=
BISECTSTACK[BISECTPTR-15]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-13]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-14]>0 THEN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15
]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[
BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;END;
BISECTSTACK[BISECTPTR-20]:=MEM[PP+6].INT-MEM[PP+2].INT;
BISECTSTACK[BISECTPTR-19]:=MEM[QQ+4].INT-MEM[PP+6].INT;
BISECTSTACK[BISECTPTR-18]:=MEM[QQ+2].INT-MEM[QQ+4].INT;
IF BISECTSTACK[BISECTPTR-20]<0 THEN IF BISECTSTACK[BISECTPTR-18]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-19]<0 THEN BISECTSTACK[BISECTPTR-17]:=
BISECTSTACK[BISECTPTR-20]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-18]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-19]>0 THEN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20
]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[
BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;END;
DELX:=MEM[P+1].INT-MEM[PP+1].INT;DELY:=MEM[P+2].INT-MEM[PP+2].INT;
UV:=BISECTPTR;XY:=BISECTPTR;CURT:=1;CURTT:=1{:544};
WHILE TRUE DO BEGIN 22:IF DELX<=BISECTSTACK[XY-11]-BISECTSTACK[UV-2]THEN
IF DELX>=BISECTSTACK[XY-12]-BISECTSTACK[UV-1]THEN IF DELY<=BISECTSTACK[
XY-16]-BISECTSTACK[UV-7]THEN IF DELY>=BISECTSTACK[XY-17]-BISECTSTACK[UV
-6]THEN BEGIN IF CURT>=131072 THEN BEGIN CURT:=(CURT+1)DIV 2;
CURTT:=(CURTT+1)DIV 2;GOTO 10;END;{545:}BISECTSTACK[BISECTPTR]:=DELX;
BISECTSTACK[BISECTPTR+1]:=DELY;BISECTSTACK[BISECTPTR+2]:=UV;
BISECTSTACK[BISECTPTR+3]:=XY;BISECTPTR:=BISECTPTR+44;CURT:=CURT+CURT;
CURTT:=CURTT+CURTT;BISECTSTACK[BISECTPTR-25]:=BISECTSTACK[UV-5];
BISECTSTACK[BISECTPTR-3]:=BISECTSTACK[UV-3];
BISECTSTACK[BISECTPTR-24]:=(BISECTSTACK[BISECTPTR-25]+BISECTSTACK[UV-4])
DIV 2;
BISECTSTACK[BISECTPTR-4]:=(BISECTSTACK[BISECTPTR-3]+BISECTSTACK[UV-4])
DIV 2;BISECTSTACK[BISECTPTR-23]:=(BISECTSTACK[BISECTPTR-24]+BISECTSTACK[
BISECTPTR-4])DIV 2;BISECTSTACK[BISECTPTR-5]:=BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-25]<0 THEN IF BISECTSTACK[BISECTPTR-23]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-24]<0 THEN BISECTSTACK[BISECTPTR-22]:=
BISECTSTACK[BISECTPTR-25]+BISECTSTACK[BISECTPTR-24]ELSE BISECTSTACK[
BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25];
BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-21]<0 THEN BISECTSTACK[BISECTPTR-21]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25]+
BISECTSTACK[BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-22]>BISECTSTACK[BISECTPTR-25]THEN BISECTSTACK[
BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25];
BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24];
IF BISECTSTACK[BISECTPTR-21]<0 THEN BISECTSTACK[BISECTPTR-21]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-23]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-24]>0 THEN BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25
]+BISECTSTACK[BISECTPTR-24]ELSE BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[
BISECTPTR-25];
BISECTSTACK[BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-22]>0 THEN BISECTSTACK[BISECTPTR-22]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25]+
BISECTSTACK[BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-21]<BISECTSTACK[BISECTPTR-25]THEN BISECTSTACK[
BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25];
BISECTSTACK[BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24];
IF BISECTSTACK[BISECTPTR-22]>0 THEN BISECTSTACK[BISECTPTR-22]:=0;END;
IF BISECTSTACK[BISECTPTR-5]<0 THEN IF BISECTSTACK[BISECTPTR-3]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-4]<0 THEN BISECTSTACK[BISECTPTR-2]:=
BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-3]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-4]>0 THEN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[
BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;END;
BISECTSTACK[BISECTPTR-30]:=BISECTSTACK[UV-10];
BISECTSTACK[BISECTPTR-8]:=BISECTSTACK[UV-8];
BISECTSTACK[BISECTPTR-29]:=(BISECTSTACK[BISECTPTR-30]+BISECTSTACK[UV-9])
DIV 2;
BISECTSTACK[BISECTPTR-9]:=(BISECTSTACK[BISECTPTR-8]+BISECTSTACK[UV-9])
DIV 2;BISECTSTACK[BISECTPTR-28]:=(BISECTSTACK[BISECTPTR-29]+BISECTSTACK[
BISECTPTR-9])DIV 2;BISECTSTACK[BISECTPTR-10]:=BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-30]<0 THEN IF BISECTSTACK[BISECTPTR-28]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-29]<0 THEN BISECTSTACK[BISECTPTR-27]:=
BISECTSTACK[BISECTPTR-30]+BISECTSTACK[BISECTPTR-29]ELSE BISECTSTACK[
BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30];
BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-26]<0 THEN BISECTSTACK[BISECTPTR-26]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30]+
BISECTSTACK[BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-27]>BISECTSTACK[BISECTPTR-30]THEN BISECTSTACK[
BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30];
BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29];
IF BISECTSTACK[BISECTPTR-26]<0 THEN BISECTSTACK[BISECTPTR-26]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-28]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-29]>0 THEN BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30
]+BISECTSTACK[BISECTPTR-29]ELSE BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[
BISECTPTR-30];
BISECTSTACK[BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-27]>0 THEN BISECTSTACK[BISECTPTR-27]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30]+
BISECTSTACK[BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-26]<BISECTSTACK[BISECTPTR-30]THEN BISECTSTACK[
BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30];
BISECTSTACK[BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29];
IF BISECTSTACK[BISECTPTR-27]>0 THEN BISECTSTACK[BISECTPTR-27]:=0;END;
IF BISECTSTACK[BISECTPTR-10]<0 THEN IF BISECTSTACK[BISECTPTR-8]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-9]<0 THEN BISECTSTACK[BISECTPTR-7]:=
BISECTSTACK[BISECTPTR-10]+BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-8]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-9]>0 THEN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[
BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;END;
BISECTSTACK[BISECTPTR-35]:=BISECTSTACK[XY-15];
BISECTSTACK[BISECTPTR-13]:=BISECTSTACK[XY-13];
BISECTSTACK[BISECTPTR-34]:=(BISECTSTACK[BISECTPTR-35]+BISECTSTACK[XY-14]
)DIV 2;
BISECTSTACK[BISECTPTR-14]:=(BISECTSTACK[BISECTPTR-13]+BISECTSTACK[XY-14]
)DIV 2;
BISECTSTACK[BISECTPTR-33]:=(BISECTSTACK[BISECTPTR-34]+BISECTSTACK[
BISECTPTR-14])DIV 2;
BISECTSTACK[BISECTPTR-15]:=BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-35]<0 THEN IF BISECTSTACK[BISECTPTR-33]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-34]<0 THEN BISECTSTACK[BISECTPTR-32]:=
BISECTSTACK[BISECTPTR-35]+BISECTSTACK[BISECTPTR-34]ELSE BISECTSTACK[
BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35];
BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-31]<0 THEN BISECTSTACK[BISECTPTR-31]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35]+
BISECTSTACK[BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-32]>BISECTSTACK[BISECTPTR-35]THEN BISECTSTACK[
BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35];
BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34];
IF BISECTSTACK[BISECTPTR-31]<0 THEN BISECTSTACK[BISECTPTR-31]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-33]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-34]>0 THEN BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35
]+BISECTSTACK[BISECTPTR-34]ELSE BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[
BISECTPTR-35];
BISECTSTACK[BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-32]>0 THEN BISECTSTACK[BISECTPTR-32]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35]+
BISECTSTACK[BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-31]<BISECTSTACK[BISECTPTR-35]THEN BISECTSTACK[
BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35];
BISECTSTACK[BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34];
IF BISECTSTACK[BISECTPTR-32]>0 THEN BISECTSTACK[BISECTPTR-32]:=0;END;
IF BISECTSTACK[BISECTPTR-15]<0 THEN IF BISECTSTACK[BISECTPTR-13]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-14]<0 THEN BISECTSTACK[BISECTPTR-12]:=
BISECTSTACK[BISECTPTR-15]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-13]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-14]>0 THEN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15
]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[
BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;END;
BISECTSTACK[BISECTPTR-40]:=BISECTSTACK[XY-20];
BISECTSTACK[BISECTPTR-18]:=BISECTSTACK[XY-18];
BISECTSTACK[BISECTPTR-39]:=(BISECTSTACK[BISECTPTR-40]+BISECTSTACK[XY-19]
)DIV 2;
BISECTSTACK[BISECTPTR-19]:=(BISECTSTACK[BISECTPTR-18]+BISECTSTACK[XY-19]
)DIV 2;
BISECTSTACK[BISECTPTR-38]:=(BISECTSTACK[BISECTPTR-39]+BISECTSTACK[
BISECTPTR-19])DIV 2;
BISECTSTACK[BISECTPTR-20]:=BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-40]<0 THEN IF BISECTSTACK[BISECTPTR-38]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-39]<0 THEN BISECTSTACK[BISECTPTR-37]:=
BISECTSTACK[BISECTPTR-40]+BISECTSTACK[BISECTPTR-39]ELSE BISECTSTACK[
BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40];
BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-36]<0 THEN BISECTSTACK[BISECTPTR-36]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40]+
BISECTSTACK[BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-37]>BISECTSTACK[BISECTPTR-40]THEN BISECTSTACK[
BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40];
BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39];
IF BISECTSTACK[BISECTPTR-36]<0 THEN BISECTSTACK[BISECTPTR-36]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-38]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-39]>0 THEN BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40
]+BISECTSTACK[BISECTPTR-39]ELSE BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[
BISECTPTR-40];
BISECTSTACK[BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-37]>0 THEN BISECTSTACK[BISECTPTR-37]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40]+
BISECTSTACK[BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-36]<BISECTSTACK[BISECTPTR-40]THEN BISECTSTACK[
BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40];
BISECTSTACK[BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39];
IF BISECTSTACK[BISECTPTR-37]>0 THEN BISECTSTACK[BISECTPTR-37]:=0;END;
IF BISECTSTACK[BISECTPTR-20]<0 THEN IF BISECTSTACK[BISECTPTR-18]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-19]<0 THEN BISECTSTACK[BISECTPTR-17]:=
BISECTSTACK[BISECTPTR-20]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-18]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-19]>0 THEN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20
]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[
BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;END;
UV:=BISECTPTR-20;XY:=BISECTPTR-20;DELX:=DELX+DELX;DELY:=DELY+DELY{:545};
GOTO 22;END;IF TIMETOGO>0 THEN TIMETOGO:=TIMETOGO-1 ELSE BEGIN CURT:=0;
CURTT:=0;GOTO 10;END;{546:}45:IF ODD(CURTT)THEN IF ODD(CURT)THEN{547:}
BEGIN CURT:=(CURT)DIV 2;CURTT:=(CURTT)DIV 2;IF CURT=0 THEN GOTO 10;
BISECTPTR:=BISECTPTR-44;DELX:=BISECTSTACK[BISECTPTR];
DELY:=BISECTSTACK[BISECTPTR+1];UV:=BISECTSTACK[BISECTPTR+2];
XY:=BISECTSTACK[BISECTPTR+3];GOTO 45;END{:547}ELSE BEGIN CURT:=CURT+1;
DELX:=DELX+BISECTSTACK[UV-5]+BISECTSTACK[UV-4]+BISECTSTACK[UV-3];
DELY:=DELY+BISECTSTACK[UV-10]+BISECTSTACK[UV-9]+BISECTSTACK[UV-8];
UV:=UV+20;CURTT:=CURTT-1;XY:=XY-20;
DELX:=DELX+BISECTSTACK[XY-15]+BISECTSTACK[XY-14]+BISECTSTACK[XY-13];
DELY:=DELY+BISECTSTACK[XY-20]+BISECTSTACK[XY-19]+BISECTSTACK[XY-18];
END ELSE BEGIN CURTT:=CURTT+1;
DELX:=DELX-BISECTSTACK[XY-15]-BISECTSTACK[XY-14]-BISECTSTACK[XY-13];
DELY:=DELY-BISECTSTACK[XY-20]-BISECTSTACK[XY-19]-BISECTSTACK[XY-18];
XY:=XY+20;END{:546};END;10:END;{:542}{548:}
PROCEDURE PATHINTERSEC(H,HH:HALFWORD);LABEL 10;VAR P,PP:HALFWORD;
N,NN:INTEGER;BEGIN{549:}
IF MEM[H].HH.B1=0 THEN BEGIN MEM[H+5].INT:=MEM[H+1].INT;
MEM[H+3].INT:=MEM[H+1].INT;MEM[H+6].INT:=MEM[H+2].INT;
MEM[H+4].INT:=MEM[H+2].INT;MEM[H].HH.B1:=1;END;
IF MEM[HH].HH.B1=0 THEN BEGIN MEM[HH+5].INT:=MEM[HH+1].INT;
MEM[HH+3].INT:=MEM[HH+1].INT;MEM[HH+6].INT:=MEM[HH+2].INT;
MEM[HH+4].INT:=MEM[HH+2].INT;MEM[HH].HH.B1:=1;END;{:549};N:=-65536;P:=H;
REPEAT IF MEM[P].HH.B1<>0 THEN BEGIN NN:=-65536;PP:=HH;
REPEAT IF MEM[PP].HH.B1<>0 THEN BEGIN CUBICINTERSE(P,PP);
IF CURT>0 THEN BEGIN CURT:=CURT+N;CURTT:=CURTT+NN;GOTO 10;END;END;
NN:=NN+65536;PP:=MEM[PP].HH.RH;UNTIL PP=HH;END;N:=N+65536;
P:=MEM[P].HH.RH;UNTIL P=H;CURT:=-65536;CURTT:=-65536;10:END;{:548}{550:}
FUNCTION INITSCREEN:BOOLEAN;BEGIN INITSCREEN:=TRUE;END;
PROCEDURE UPDATESCREEN;BEGIN WRITELN(LOGFILE,'Calling UPDATESCREEN');
END;{:550}{553:}PROCEDURE BLANKRECTANG(LEFTCOL,RIGHTCOL:SCREENCOL;
TOPROW,BOTROW:SCREENROW);VAR R:SCREENROW;C:SCREENCOL;
BEGIN{FOR R:=TOPROW TO BOTROW-1 DO FOR C:=LEFTCOL TO RIGHTCOL-1 DO
SCREENPIXEL[R,C]:=0;}WRITELN(LOGFILE);
WRITELN(LOGFILE,'Calling BLANKRECTANGLE(',LEFTCOL:1,',',RIGHTCOL:1,',',
TOPROW:1,',',BOTROW:1,')');END;{:553}{554:}
PROCEDURE PAINTROW(R:SCREENROW;B:PIXELCOLOR;VAR A:TRANSSPEC;
N:SCREENCOL);VAR K:SCREENCOL;C:SCREENCOL;BEGIN{K:=0;C:=A[0];
REPEAT K:=K+1;REPEAT SCREENPIXEL[R,C]:=B;C:=C+1;UNTIL C=A[K];B:=1-B;
UNTIL K=N;}WRITE(LOGFILE,'Calling PAINTROW(',R:1,',',B:1,';');
FOR K:=0 TO N DO BEGIN WRITE(LOGFILE,A[K]:1);
IF K<>N THEN WRITE(LOGFILE,',');END;WRITELN(LOGFILE,')');END;{:554}
{560:}PROCEDURE OPENAWINDOW(K:WINDOWNUMBER;R0,C0,R1,C1:SCALED;
X,Y:SCALED);VAR M,N:INTEGER;BEGIN{561:}
IF R0<0 THEN R0:=0 ELSE R0:=ROUNDUNSCALE(R0);R1:=ROUNDUNSCALE(R1);
IF R1>SCREENDEPTH THEN R1:=SCREENDEPTH;
IF R1<R0 THEN IF R0>SCREENDEPTH THEN R0:=R1 ELSE R1:=R0;
IF C0<0 THEN C0:=0 ELSE C0:=ROUNDUNSCALE(C0);C1:=ROUNDUNSCALE(C1);
IF C1>SCREENWIDTH THEN C1:=SCREENWIDTH;
IF C1<C0 THEN IF C0>SCREENWIDTH THEN C0:=C1 ELSE C1:=C0{:561};
WINDOWOPEN[K]:=TRUE;WINDOWTIME[K]:=WINDOWTIME[K]+1;LEFTCOL[K]:=C0;
RIGHTCOL[K]:=C1;TOPROW[K]:=R0;BOTROW[K]:=R1;{562:}M:=ROUNDUNSCALE(X);
N:=ROUNDUNSCALE(Y)-1;MWINDOW[K]:=C0-M;NWINDOW[K]:=R0+N{:562};
BEGIN IF NOT SCREENSTARTE THEN BEGIN SCREENOK:=INITSCREEN;
SCREENSTARTE:=TRUE;END;END;
IF SCREENOK THEN BEGIN BLANKRECTANG(C0,C1,R0,R1);UPDATESCREEN;END;END;
{:560}{563:}PROCEDURE DISPEDGES(K:WINDOWNUMBER);LABEL 30,40;
VAR P,Q:HALFWORD;ALREADYTHERE:BOOLEAN;R:INTEGER;{566:}N:SCREENCOL;
W,WW:INTEGER;B:PIXELCOLOR;M,MM:INTEGER;D:INTEGER;MADJUSTMENT:INTEGER;
RIGHTEDGE:INTEGER;MINCOL:SCREENCOL;{:566}
BEGIN IF SCREENOK THEN IF LEFTCOL[K]<RIGHTCOL[K]THEN IF TOPROW[K]<BOTROW
[K]THEN BEGIN ALREADYTHERE:=FALSE;
IF MEM[CUREDGES+3].HH.RH=K THEN IF MEM[CUREDGES+4].INT=WINDOWTIME[K]THEN
ALREADYTHERE:=TRUE;
IF NOT ALREADYTHERE THEN BLANKRECTANG(LEFTCOL[K],RIGHTCOL[K],TOPROW[K],
BOTROW[K]);{567:}MADJUSTMENT:=MWINDOW[K]-MEM[CUREDGES+3].HH.LH;
RIGHTEDGE:=8*(RIGHTCOL[K]-MADJUSTMENT);MINCOL:=LEFTCOL[K]{:567};
P:=MEM[CUREDGES].HH.RH;R:=NWINDOW[K]-(MEM[CUREDGES+1].HH.LH-4096);
WHILE(P<>CUREDGES)AND(R>=TOPROW[K])DO BEGIN IF R<BOTROW[K]THEN{564:}
BEGIN IF MEM[P+1].HH.LH>1 THEN SORTEDGES(P)ELSE IF MEM[P+1].HH.LH=1 THEN
IF ALREADYTHERE THEN GOTO 30;MEM[P+1].HH.LH:=1;{568:}N:=0;WW:=0;M:=-1;
W:=0;Q:=MEM[P+1].HH.RH;ROWTRANSITIO[0]:=MINCOL;
WHILE TRUE DO BEGIN IF Q=3000 THEN D:=RIGHTEDGE ELSE D:=0+MEM[Q].HH.LH-0
;MM:=(D DIV 8)+MADJUSTMENT;IF MM<>M THEN BEGIN{569:}
IF W<=0 THEN BEGIN IF WW>0 THEN IF M>MINCOL THEN BEGIN IF N=0 THEN IF
ALREADYTHERE THEN BEGIN B:=0;N:=N+1;END ELSE B:=1 ELSE N:=N+1;
ROWTRANSITIO[N]:=M;END;
END ELSE IF WW<=0 THEN IF M>MINCOL THEN BEGIN IF N=0 THEN B:=1;N:=N+1;
ROWTRANSITIO[N]:=M;END{:569};M:=MM;W:=WW;END;
IF D>=RIGHTEDGE THEN GOTO 40;WW:=WW+(D MOD 8)-4;Q:=MEM[Q].HH.RH;END;
40:{570:}
IF ALREADYTHERE OR(WW>0)THEN BEGIN IF N=0 THEN IF WW>0 THEN B:=1 ELSE B
:=0;N:=N+1;ROWTRANSITIO[N]:=RIGHTCOL[K];
END ELSE IF N=0 THEN GOTO 30{:570};{:568};PAINTROW(R,B,ROWTRANSITIO,N);
30:END{:564};P:=MEM[P].HH.RH;R:=R-1;END;UPDATESCREEN;
WINDOWTIME[K]:=WINDOWTIME[K]+1;MEM[CUREDGES+3].HH.RH:=K;
MEM[CUREDGES+4].INT:=WINDOWTIME[K];END;END;{:563}{576:}
FUNCTION MAXCOEF(P:HALFWORD):FRACTION;VAR X:FRACTION;BEGIN X:=0;
WHILE MEM[P].HH.LH<>0 DO BEGIN IF ABS(MEM[P+1].INT)>X THEN X:=ABS(MEM[P
+1].INT);P:=MEM[P].HH.RH;END;MAXCOEF:=X;END;{:576}{582:}
FUNCTION PPLUSQ(P:HALFWORD;Q:HALFWORD;T:SMALLNUMBER):HALFWORD;LABEL 30;
VAR PP,QQ:HALFWORD;R,S:HALFWORD;THRESHOLD:INTEGER;V:INTEGER;
BEGIN IF T=16 THEN THRESHOLD:=2685 ELSE THRESHOLD:=8;R:=2999;
PP:=MEM[P].HH.LH;QQ:=MEM[Q].HH.LH;
WHILE TRUE DO IF PP=QQ THEN IF PP=0 THEN GOTO 30 ELSE{583:}
BEGIN V:=MEM[P+1].INT+MEM[Q+1].INT;MEM[P+1].INT:=V;S:=P;P:=MEM[P].HH.RH;
PP:=MEM[P].HH.LH;
IF ABS(V)<THRESHOLD THEN FREENODE(S,2)ELSE BEGIN IF ABS(V)>=626349397
THEN IF WATCHCOEFS THEN BEGIN MEM[QQ].HH.B0:=0;FIXNEEDED:=TRUE;END;
MEM[R].HH.RH:=S;R:=S;END;Q:=MEM[Q].HH.RH;QQ:=MEM[Q].HH.LH;END{:583}
ELSE IF PP<QQ THEN BEGIN S:=GETNODE(2);MEM[S].HH.LH:=QQ;
MEM[S+1].INT:=MEM[Q+1].INT;Q:=MEM[Q].HH.RH;QQ:=MEM[Q].HH.LH;
MEM[R].HH.RH:=S;R:=S;END ELSE BEGIN MEM[R].HH.RH:=P;R:=P;
P:=MEM[P].HH.RH;PP:=MEM[P].HH.LH;END;
30:MEM[P+1].INT:=SLOWADD(MEM[P+1].INT,MEM[Q+1].INT);MEM[R].HH.RH:=P;
DEPFINAL:=P;PPLUSQ:=MEM[2999].HH.RH;END;{:582}{584:}
FUNCTION PTIMESV(P:HALFWORD;V:INTEGER;T0,T1:SMALLNUMBER;
VISSCALED:BOOLEAN):HALFWORD;VAR R,S:HALFWORD;W:INTEGER;
THRESHOLD:INTEGER;SCALINGDOWN:BOOLEAN;
BEGIN IF T0<>T1 THEN SCALINGDOWN:=TRUE ELSE SCALINGDOWN:=NOT VISSCALED;
IF T1=16 THEN THRESHOLD:=1342 ELSE THRESHOLD:=4;R:=2999;
WHILE MEM[P].HH.LH<>0 DO BEGIN IF SCALINGDOWN THEN W:=TAKEFRACTION(V,MEM
[P+1].INT)ELSE W:=TAKESCALED(V,MEM[P+1].INT);
IF ABS(W)<=THRESHOLD THEN BEGIN S:=MEM[P].HH.RH;FREENODE(P,2);P:=S;
END ELSE BEGIN IF ABS(W)>=626349397 THEN BEGIN FIXNEEDED:=TRUE;
MEM[MEM[P].HH.LH].HH.B0:=0;END;MEM[R].HH.RH:=P;R:=P;MEM[P+1].INT:=W;
P:=MEM[P].HH.RH;END;END;MEM[R].HH.RH:=P;
IF VISSCALED THEN MEM[P+1].INT:=TAKESCALED(MEM[P+1].INT,V)ELSE MEM[P+1].
INT:=TAKEFRACTION(MEM[P+1].INT,V);PTIMESV:=MEM[2999].HH.RH;END;{:584}
{586:}FUNCTION PWITHXBECOMI(P,X,Q:HALFWORD;T:SMALLNUMBER):HALFWORD;
VAR R,S:HALFWORD;V:INTEGER;BEGIN S:=P;R:=2999;
WHILE MEM[S].HH.LH>X DO BEGIN R:=S;S:=MEM[S].HH.RH;END;
IF MEM[S].HH.LH<>X THEN PWITHXBECOMI:=P ELSE BEGIN MEM[2999].HH.RH:=P;
MEM[R].HH.RH:=MEM[S].HH.RH;V:=MEM[S+1].INT;FREENODE(S,2);
PWITHXBECOMI:=PPLUSFQ(MEM[2999].HH.RH,V,Q,T,16);END;END;{:586}{591:}
PROCEDURE NEWDEP(Q,P:HALFWORD);VAR R:HALFWORD;BEGIN MEM[Q+1].HH.RH:=P;
MEM[Q+1].HH.LH:=13;R:=MEM[13].HH.RH;MEM[DEPFINAL].HH.RH:=R;
MEM[R+1].HH.LH:=DEPFINAL;MEM[13].HH.RH:=Q;END;{:591}{592:}
FUNCTION CONSTDEPENDE(V:SCALED):HALFWORD;BEGIN DEPFINAL:=GETNODE(2);
MEM[DEPFINAL+1].INT:=V;MEM[DEPFINAL].HH.LH:=0;CONSTDEPENDE:=DEPFINAL;
END;{:592}{593:}FUNCTION SINGLEDEPEND(P:HALFWORD):HALFWORD;
VAR Q:HALFWORD;
BEGIN IF MEM[P+1].INT>28 THEN SINGLEDEPEND:=CONSTDEPENDE(0)ELSE BEGIN Q
:=GETNODE(2);MEM[Q+1].INT:=TWOTOTHE[28-MEM[P+1].INT];MEM[Q].HH.LH:=P;
MEM[Q].HH.RH:=CONSTDEPENDE(0);SINGLEDEPEND:=Q;END;END;{:593}{594:}
FUNCTION COPYDEPLIST(P:HALFWORD):HALFWORD;LABEL 30;VAR Q:HALFWORD;
BEGIN Q:=GETNODE(2);DEPFINAL:=Q;
WHILE TRUE DO BEGIN MEM[DEPFINAL].HH.LH:=MEM[P].HH.LH;
MEM[DEPFINAL+1].INT:=MEM[P+1].INT;IF MEM[DEPFINAL].HH.LH=0 THEN GOTO 30;
MEM[DEPFINAL].HH.RH:=GETNODE(2);DEPFINAL:=MEM[DEPFINAL].HH.RH;
P:=MEM[P].HH.RH;END;30:COPYDEPLIST:=Q;END;{:594}{595:}
PROCEDURE LINEAREQ(P:HALFWORD;T:SMALLNUMBER);VAR Q,R,S:HALFWORD;
X:HALFWORD;N:INTEGER;V:INTEGER;PREVR:HALFWORD;FINALNODE:HALFWORD;
W:INTEGER;BEGIN{596:}Q:=P;R:=MEM[P].HH.RH;V:=MEM[Q+1].INT;
WHILE MEM[R].HH.LH<>0 DO BEGIN IF ABS(MEM[R+1].INT)>ABS(V)THEN BEGIN Q:=
R;V:=MEM[R+1].INT;END;R:=MEM[R].HH.RH;END{:596};X:=MEM[Q].HH.LH;
N:=MEM[X+1].INT;{597:}S:=2999;MEM[S].HH.RH:=P;R:=P;
REPEAT IF R=Q THEN BEGIN MEM[S].HH.RH:=MEM[R].HH.RH;FREENODE(R,2);
END ELSE BEGIN W:=MAKEFRACTION(MEM[R+1].INT,V);
IF ABS(W)<=1342 THEN BEGIN MEM[S].HH.RH:=MEM[R].HH.RH;FREENODE(R,2);
END ELSE BEGIN MEM[R+1].INT:=-W;S:=R;END;END;R:=MEM[S].HH.RH;
UNTIL MEM[R].HH.LH=0;
IF T=17 THEN MEM[R+1].INT:=-MAKESCALED(MEM[R+1].INT,V)ELSE IF V<>
-268435456 THEN MEM[R+1].INT:=-MAKEFRACTION(MEM[R+1].INT,V);
FINALNODE:=R;P:=MEM[2999].HH.RH{:597};IF INTERNAL[2]>0 THEN{598:}
IF INTERESTING(X)THEN BEGIN BEGINDIAGNOS;PRINTNL(457);PRINTVARIABL(X);
W:=N;WHILE W>0 DO BEGIN PRINT(450);W:=W-2;END;PRINTCHAR(61);
PRINTDEPENDE(P,16);ENDDIAGNOSTI(FALSE);END{:598};{599:}PREVR:=13;
R:=MEM[13].HH.RH;WHILE R<>13 DO BEGIN S:=MEM[R+1].HH.RH;
Q:=PWITHXBECOMI(S,X,P,MEM[R].HH.B0);
IF MEM[Q].HH.LH=0 THEN MAKEKNOWN(R,Q)ELSE BEGIN MEM[R+1].HH.RH:=Q;
REPEAT Q:=MEM[Q].HH.RH;UNTIL MEM[Q].HH.LH=0;PREVR:=Q;END;
R:=MEM[PREVR].HH.RH;END{:599};{600:}IF N>0 THEN{601:}BEGIN S:=2999;
MEM[2999].HH.RH:=P;R:=P;
REPEAT IF N>30 THEN W:=0 ELSE W:=MEM[R+1].INT DIV TWOTOTHE[N];
IF(ABS(W)<=1342)AND(MEM[R].HH.LH<>0)THEN BEGIN MEM[S].HH.RH:=MEM[R].HH.
RH;FREENODE(R,2);END ELSE BEGIN MEM[R+1].INT:=W;S:=R;END;
R:=MEM[S].HH.RH;UNTIL MEM[S].HH.LH=0;P:=MEM[2999].HH.RH;END{:601};
IF MEM[P].HH.LH=0 THEN BEGIN MEM[X].HH.B0:=15;
MEM[X+1].INT:=MEM[P+1].INT;
IF ABS(MEM[X+1].INT)>=268435456 THEN VALTOOBIG(MEM[X+1].INT);
FREENODE(P,2);
IF CUREXP=X THEN IF CURTYPE=19 THEN BEGIN CUREXP:=MEM[X+1].INT;
CURTYPE:=15;FREENODE(X,2);END;END ELSE BEGIN MEM[X].HH.B0:=16;
DEPFINAL:=FINALNODE;NEWDEP(X,P);
IF CUREXP=X THEN IF CURTYPE=19 THEN CURTYPE:=16;END{:600};
IF FIXNEEDED THEN FIXDEPENDENC;END;{:595}{604:}
FUNCTION NEWRINGENTRY(P:HALFWORD):HALFWORD;VAR Q:HALFWORD;
BEGIN Q:=GETNODE(2);MEM[Q].HH.B1:=11;MEM[Q].HH.B0:=MEM[P].HH.B0;
IF MEM[P+1].INT=0 THEN MEM[Q+1].INT:=P ELSE MEM[Q+1].INT:=MEM[P+1].INT;
MEM[P+1].INT:=Q;NEWRINGENTRY:=Q;END;{:604}{606:}
PROCEDURE NONLINEAREQ(V:INTEGER;P:HALFWORD;FLUSHP:BOOLEAN);
VAR T:SMALLNUMBER;Q,R:HALFWORD;BEGIN T:=MEM[P].HH.B0-1;Q:=MEM[P+1].INT;
IF FLUSHP THEN MEM[P].HH.B0:=1 ELSE P:=Q;REPEAT R:=MEM[Q+1].INT;
MEM[Q].HH.B0:=T;CASE T OF 2:MEM[Q+1].INT:=V;4:BEGIN MEM[Q+1].INT:=V;
BEGIN IF STRREF[V]<127 THEN STRREF[V]:=STRREF[V]+1;END;END;
6:BEGIN MEM[Q+1].INT:=V;MEM[V].HH.LH:=MEM[V].HH.LH+1;END;
9:MEM[Q+1].INT:=COPYPATH(V);11:MEM[Q+1].INT:=COPYEDGES(V);END;Q:=R;
UNTIL Q=P;END;{:606}{607:}PROCEDURE RINGMERGE(P,Q:HALFWORD);LABEL 10;
VAR R:HALFWORD;BEGIN R:=MEM[P+1].INT;
WHILE R<>P DO BEGIN IF R=Q THEN BEGIN{608:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(460);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=461;HELPLINE[0]:=462;END;PUTGETERROR;
END{:608};GOTO 10;END;R:=MEM[R+1].INT;END;R:=MEM[P+1].INT;
MEM[P+1].INT:=MEM[Q+1].INT;MEM[Q+1].INT:=R;10:END;{:607}{611:}
PROCEDURE SHOWCMDMOD(C,M:INTEGER);BEGIN BEGINDIAGNOS;PRINTNL(123);
PRINTCMDMOD(C,M);PRINTCHAR(125);ENDDIAGNOSTI(FALSE);END;{:611}{620:}
PROCEDURE SHOWCONTEXT;LABEL 30;VAR OLDSETTING:0..5;{626:}I:0..BUFSIZE;
L:INTEGER;M:INTEGER;N:0..ERRORLINE;P:INTEGER;Q:INTEGER;{:626}
BEGIN FILEPTR:=INPUTPTR;INPUTSTACK[FILEPTR]:=CURINPUT;
WHILE TRUE DO BEGIN CURINPUT:=INPUTSTACK[FILEPTR];{621:}
IF(FILEPTR=INPUTPTR)OR(CURINPUT.INDEXFIELD<=6)OR(CURINPUT.INDEXFIELD<>10
)OR(CURINPUT.LOCFIELD<>0)THEN BEGIN TALLY:=0;OLDSETTING:=SELECTOR;
IF(CURINPUT.INDEXFIELD<=6)THEN BEGIN{622:}
IF CURINPUT.NAMEFIELD<=1 THEN IF(CURINPUT.NAMEFIELD=0)AND(FILEPTR=0)THEN
PRINTNL(464)ELSE PRINTNL(465)ELSE IF CURINPUT.NAMEFIELD=2 THEN PRINTNL(
466)ELSE BEGIN IF PAGE>1 THEN BEGIN PRINTNL(467);PRINTINT(PAGE);
PRINT(468);END ELSE PRINTNL(469);PRINTINT(LINE);END;PRINTCHAR(32){:622};
{629:}BEGIN L:=TALLY;TALLY:=0;SELECTOR:=4;TRICKCOUNT:=1000000;END;
IF CURINPUT.LIMITFIELD>0 THEN FOR I:=CURINPUT.STARTFIELD TO CURINPUT.
LIMITFIELD-1 DO BEGIN IF I=CURINPUT.LOCFIELD THEN BEGIN FIRSTCOUNT:=
TALLY;TRICKCOUNT:=TALLY+1+ERRORLINE-HALFERRORLIN;
IF TRICKCOUNT<ERRORLINE THEN TRICKCOUNT:=ERRORLINE;END;PRINT(BUFFER[I]);
END{:629};END ELSE BEGIN{623:}
CASE CURINPUT.INDEXFIELD OF 7:PRINTNL(470);8:{624:}BEGIN PRINTNL(475);
P:=PARAMSTACK[CURINPUT.LIMITFIELD];
IF P<>0 THEN IF MEM[P].HH.RH=1 THEN PRINTEXP(P,0)ELSE SHOWTOKENLIS(P,0,
20);PRINT(476);END{:624};9:PRINTNL(471);
10:IF CURINPUT.LOCFIELD=0 THEN PRINTNL(472)ELSE PRINTNL(473);
11:PRINTNL(474);12:BEGIN PRINTLN;
IF CURINPUT.NAMEFIELD<>0 THEN PRINT(HASH[CURINPUT.NAMEFIELD].RH)ELSE{625
:}BEGIN P:=PARAMSTACK[CURINPUT.LIMITFIELD];
IF P=0 THEN SHOWTOKENLIS(PARAMSTACK[CURINPUT.LIMITFIELD+1],0,20)ELSE
BEGIN Q:=P;WHILE MEM[Q].HH.RH<>0 DO Q:=MEM[Q].HH.RH;
MEM[Q].HH.RH:=PARAMSTACK[CURINPUT.LIMITFIELD+1];SHOWTOKENLIS(P,0,20);
MEM[Q].HH.RH:=0;END;END{:625};PRINT(370);END;OTHERS:PRINTNL(63)END{:623}
;{630:}BEGIN L:=TALLY;TALLY:=0;SELECTOR:=4;TRICKCOUNT:=1000000;END;
IF CURINPUT.INDEXFIELD<>12 THEN SHOWTOKENLIS(CURINPUT.STARTFIELD,
CURINPUT.LOCFIELD,100000)ELSE SHOWMACRO(CURINPUT.STARTFIELD,CURINPUT.
LOCFIELD,100000){:630};END;SELECTOR:=OLDSETTING;{628:}
IF TRICKCOUNT=1000000 THEN BEGIN FIRSTCOUNT:=TALLY;
TRICKCOUNT:=TALLY+1+ERRORLINE-HALFERRORLIN;
IF TRICKCOUNT<ERRORLINE THEN TRICKCOUNT:=ERRORLINE;END;
IF TALLY<TRICKCOUNT THEN M:=TALLY-FIRSTCOUNT ELSE M:=TRICKCOUNT-
FIRSTCOUNT;IF L+FIRSTCOUNT<=HALFERRORLIN THEN BEGIN P:=0;
N:=L+FIRSTCOUNT;END ELSE BEGIN PRINT(148);
P:=L+FIRSTCOUNT-HALFERRORLIN+3;N:=HALFERRORLIN;END;
FOR Q:=P TO FIRSTCOUNT-1 DO PRINTCHAR(TRICKBUF[Q MOD ERRORLINE]);
PRINTLN;FOR Q:=1 TO N DO PRINTCHAR(32);
IF M+N<=ERRORLINE THEN P:=FIRSTCOUNT+M ELSE P:=FIRSTCOUNT+(ERRORLINE-N-3
);FOR Q:=FIRSTCOUNT TO P-1 DO PRINTCHAR(TRICKBUF[Q MOD ERRORLINE]);
IF M+N>ERRORLINE THEN PRINT(148){:628};END{:621};
IF(CURINPUT.INDEXFIELD<=6)THEN IF(CURINPUT.NAMEFIELD>2)OR(FILEPTR=0)THEN
GOTO 30;FILEPTR:=FILEPTR-1;END;30:CURINPUT:=INPUTSTACK[INPUTPTR];END;
{:620}{634:}PROCEDURE BEGINTOKENLI(P:HALFWORD;T:QUARTERWORD);
BEGIN BEGIN IF INPUTPTR>MAXINSTACK THEN BEGIN MAXINSTACK:=INPUTPTR;
IF INPUTPTR=STACKSIZE THEN OVERFLOW(477,STACKSIZE);END;
INPUTSTACK[INPUTPTR]:=CURINPUT;INPUTPTR:=INPUTPTR+1;END;
CURINPUT.STARTFIELD:=P;CURINPUT.INDEXFIELD:=T;
CURINPUT.LIMITFIELD:=PARAMPTR;CURINPUT.LOCFIELD:=P;END;{:634}{635:}
PROCEDURE ENDTOKENLIST;LABEL 30;VAR P:HALFWORD;
BEGIN IF CURINPUT.INDEXFIELD>=10 THEN IF CURINPUT.INDEXFIELD<=11 THEN
BEGIN FLUSHTOKENLI(CURINPUT.STARTFIELD);GOTO 30;
END ELSE DELETEMACREF(CURINPUT.STARTFIELD);
WHILE PARAMPTR>CURINPUT.LIMITFIELD DO BEGIN PARAMPTR:=PARAMPTR-1;
P:=PARAMSTACK[PARAMPTR];
IF P<>0 THEN IF MEM[P].HH.RH=1 THEN BEGIN RECYCLEVALUE(P);FREENODE(P,2);
END ELSE FLUSHTOKENLI(P);END;30:BEGIN INPUTPTR:=INPUTPTR-1;
CURINPUT:=INPUTSTACK[INPUTPTR];END;
BEGIN IF INTERRUPT<>0 THEN PAUSEFORINST;END;END;{:635}{636:}{838:}{839:}
PROCEDURE ENCAPSULATE(P:HALFWORD);BEGIN CUREXP:=GETNODE(2);
MEM[CUREXP].HH.B0:=CURTYPE;MEM[CUREXP].HH.B1:=11;NEWDEP(CUREXP,P);END;
{:839}{841:}PROCEDURE INSTALL(R,Q:HALFWORD);VAR P:HALFWORD;
BEGIN IF MEM[Q].HH.B0=15 THEN BEGIN MEM[R+1].INT:=MEM[Q+1].INT;
MEM[R].HH.B0:=15;
END ELSE IF MEM[Q].HH.B0=19 THEN BEGIN P:=SINGLEDEPEND(Q);
IF P=DEPFINAL THEN BEGIN MEM[R].HH.B0:=15;MEM[R+1].INT:=0;FREENODE(P,2);
END ELSE BEGIN MEM[R].HH.B0:=16;NEWDEP(R,P);END;
END ELSE BEGIN MEM[R].HH.B0:=MEM[Q].HH.B0;
NEWDEP(R,COPYDEPLIST(MEM[Q+1].HH.RH));END;END;{:841}
PROCEDURE MAKEEXPCOPY(P:HALFWORD);LABEL 20;VAR Q,R,T:HALFWORD;
BEGIN 20:CURTYPE:=MEM[P].HH.B0;
CASE CURTYPE OF 1,2,15:CUREXP:=MEM[P+1].INT;
3,5,7,12,10:CUREXP:=NEWRINGENTRY(P);4:BEGIN CUREXP:=MEM[P+1].INT;
BEGIN IF STRREF[CUREXP]<127 THEN STRREF[CUREXP]:=STRREF[CUREXP]+1;END;
END;6:BEGIN CUREXP:=MEM[P+1].INT;MEM[CUREXP].HH.LH:=MEM[CUREXP].HH.LH+1;
END;11:CUREXP:=COPYEDGES(MEM[P+1].INT);
9,8:CUREXP:=COPYPATH(MEM[P+1].INT);13,14:{840:}
BEGIN IF MEM[P+1].INT=0 THEN INITBIGNODE(P);T:=GETNODE(2);
MEM[T].HH.B1:=11;MEM[T].HH.B0:=CURTYPE;INITBIGNODE(T);
Q:=MEM[P+1].INT+BIGNODESIZE[CURTYPE];
R:=MEM[T+1].INT+BIGNODESIZE[CURTYPE];REPEAT Q:=Q-2;R:=R-2;INSTALL(R,Q);
UNTIL Q=MEM[P+1].INT;CUREXP:=T;END{:840};
16,17:ENCAPSULATE(COPYDEPLIST(MEM[P+1].HH.RH));
18:BEGIN MEM[P].HH.B0:=19;MEM[P+1].INT:=0;GOTO 20;END;
19:BEGIN Q:=SINGLEDEPEND(P);IF Q=DEPFINAL THEN BEGIN CURTYPE:=15;
CUREXP:=0;FREENODE(Q,2);END ELSE BEGIN CURTYPE:=16;ENCAPSULATE(Q);END;
END;OTHERS:CONFUSION(664)END;END;{:838}FUNCTION CURTOK:HALFWORD;
VAR P:HALFWORD;SAVETYPE:SMALLNUMBER;SAVEEXP:INTEGER;
BEGIN IF CURSYM=0 THEN IF CURCMD=38 THEN BEGIN SAVETYPE:=CURTYPE;
SAVEEXP:=CUREXP;MAKEEXPCOPY(CURMOD);P:=STASHCUREXP;MEM[P].HH.RH:=0;
CURTYPE:=SAVETYPE;CUREXP:=SAVEEXP;END ELSE BEGIN P:=GETNODE(2);
MEM[P+1].INT:=CURMOD;MEM[P].HH.B1:=12;
IF CURCMD=42 THEN MEM[P].HH.B0:=15 ELSE MEM[P].HH.B0:=4;
END ELSE BEGIN P:=GETAVAIL;MEM[P].HH.LH:=CURSYM;END;CURTOK:=P;END;{:636}
{637:}PROCEDURE BACKINPUT;VAR P:HALFWORD;S:0..150;BEGIN P:=CURTOK;
WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.LOCFIELD=0)DO ENDTOKENLIST;
BEGINTOKENLI(P,10);END;{:637}{638:}PROCEDURE BACKERROR;
BEGIN OKTOINTERRUP:=FALSE;BACKINPUT;OKTOINTERRUP:=TRUE;ERROR;END;
PROCEDURE INSERROR;BEGIN OKTOINTERRUP:=FALSE;BACKINPUT;
CURINPUT.INDEXFIELD:=11;OKTOINTERRUP:=TRUE;ERROR;END;{:638}{639:}
PROCEDURE BEGINFILEREA;BEGIN IF INOPEN=6 THEN OVERFLOW(478,6);
IF FIRST=BUFSIZE THEN OVERFLOW(128,BUFSIZE);INOPEN:=INOPEN+1;
BEGIN IF INPUTPTR>MAXINSTACK THEN BEGIN MAXINSTACK:=INPUTPTR;
IF INPUTPTR=STACKSIZE THEN OVERFLOW(477,STACKSIZE);END;
INPUTSTACK[INPUTPTR]:=CURINPUT;INPUTPTR:=INPUTPTR+1;END;
CURINPUT.INDEXFIELD:=INOPEN;LINESTACK[CURINPUT.INDEXFIELD]:=LINE;
CURINPUT.STARTFIELD:=FIRST;PAGESTACK[CURINPUT.INDEXFIELD]:=PAGE;
CURINPUT.NAMEFIELD:=0;END;{:639}{640:}PROCEDURE ENDFILEREADI;
BEGIN FIRST:=CURINPUT.STARTFIELD;PAGE:=PAGESTACK[CURINPUT.INDEXFIELD];
LINE:=LINESTACK[CURINPUT.INDEXFIELD];
IF CURINPUT.INDEXFIELD<>INOPEN THEN CONFUSION(479);
IF CURINPUT.NAMEFIELD>2 THEN ACLOSE(INPUTFILE[CURINPUT.INDEXFIELD]);
BEGIN INPUTPTR:=INPUTPTR-1;CURINPUT:=INPUTSTACK[INPUTPTR];END;
INOPEN:=INOPEN-1;END;{:640}{641:}PROCEDURE CLEARFORERRO;
BEGIN WHILE(CURINPUT.INDEXFIELD<=6)AND(CURINPUT.NAMEFIELD=0)AND(INPUTPTR
>0)AND(CURINPUT.LOCFIELD=CURINPUT.LIMITFIELD)DO ENDFILEREADI;PRINTLN;
BREAKIN(TTY,TRUE);END;{:641}{646:}FUNCTION CHECKOUTERVA:BOOLEAN;
VAR P:HALFWORD;
BEGIN IF SCANNERSTATU=0 THEN CHECKOUTERVA:=TRUE ELSE BEGIN DELETIONSALL
:=FALSE;{647:}IF CURSYM<>0 THEN BEGIN P:=GETAVAIL;MEM[P].HH.LH:=CURSYM;
BEGINTOKENLI(P,10);END{:647};IF SCANNERSTATU>1 THEN{648:}BEGIN RUNAWAY;
IF CURSYM=0 THEN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(485);END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(486);END;END;PRINT(487);BEGIN HELPPTR:=4;
HELPLINE[3]:=488;HELPLINE[2]:=489;HELPLINE[1]:=490;HELPLINE[0]:=491;END;
CASE SCANNERSTATU OF{649:}2:BEGIN PRINT(492);HELPLINE[3]:=493;
CURSYM:=2235;END;3:BEGIN PRINT(494);HELPLINE[3]:=495;
IF WARNINGINFO=0 THEN CURSYM:=2240 ELSE BEGIN CURSYM:=2231;
EQTB[2231].RH:=WARNINGINFO;END;END;4,5:BEGIN PRINT(496);
IF SCANNERSTATU=5 THEN PRINT(HASH[WARNINGINFO].RH)ELSE PRINTVARIABL(
WARNINGINFO);CURSYM:=2237;END;6:BEGIN PRINT(497);
PRINT(HASH[WARNINGINFO].RH);PRINT(498);HELPLINE[3]:=499;CURSYM:=2236;
END;{:649}END;INSERROR;END{:648}
ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(480);END;PRINTINT(WARNINGINFO);BEGIN HELPPTR:=3;HELPLINE[2]:=481;
HELPLINE[1]:=482;HELPLINE[0]:=483;END;IF CURSYM=0 THEN HELPLINE[2]:=484;
CURSYM:=2238;INSERROR;END;DELETIONSALL:=TRUE;CHECKOUTERVA:=FALSE;END;
END;{:646}{651:}PROCEDURE FIRMUPTHELIN;FORWARD;{:651}{652:}
PROCEDURE GETNEXT;LABEL 20,10,40,25,85,86,87,30;VAR K:0..BUFSIZE;
C:ASCIICODE;CLASS:ASCIICODE;N,F:INTEGER;BEGIN 20:CURSYM:=0;
IF(CURINPUT.INDEXFIELD<=6)THEN{654:}
BEGIN 25:C:=BUFFER[CURINPUT.LOCFIELD];
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;CLASS:=CHARCLASS[C];
CASE CLASS OF 0:GOTO 85;
1:BEGIN CLASS:=CHARCLASS[BUFFER[CURINPUT.LOCFIELD]];
IF CLASS>1 THEN GOTO 25 ELSE IF CLASS<1 THEN BEGIN N:=0;GOTO 86;END;END;
2:GOTO 25;3:BEGIN{664:}IF CURINPUT.NAMEFIELD>2 THEN{666:}
BEGIN LINE:=LINE+1;FIRST:=CURINPUT.STARTFIELD;
IF NOT FORCEEOF THEN BEGIN IF INPUTLN(INPUTFILE[CURINPUT.INDEXFIELD],
TRUE)THEN FIRMUPTHELIN ELSE FORCEEOF:=TRUE;END;
IF FORCEEOF THEN BEGIN PRINTCHAR(41);FORCEEOF:=FALSE;BREAK(TTY);
ENDFILEREADI;IF CHECKOUTERVA THEN GOTO 20 ELSE GOTO 20;END;
BUFFER[CURINPUT.LIMITFIELD]:=37;FIRST:=CURINPUT.LIMITFIELD+1;
CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;END{:666}
ELSE BEGIN IF INPUTPTR>0 THEN BEGIN ENDFILEREADI;GOTO 20;END;
IF SELECTOR<2 THEN OPENLOGFILE;
IF INTERACTION>1 THEN BEGIN IF CURINPUT.LIMITFIELD=CURINPUT.STARTFIELD
THEN PRINTNL(514);PRINTLN;FIRST:=CURINPUT.STARTFIELD;
BEGIN BEGIN IF INSKP0 THEN END;PRINT(42);TERMINPUT;END;
CURINPUT.LIMITFIELD:=LAST;BUFFER[CURINPUT.LIMITFIELD]:=37;
FIRST:=CURINPUT.LIMITFIELD+1;CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;
END ELSE FATALERROR(515);END{:664};
BEGIN IF INTERRUPT<>0 THEN PAUSEFORINST;END;GOTO 25;END;4:{656:}
BEGIN IF BUFFER[CURINPUT.LOCFIELD]=34 THEN CURMOD:=157 ELSE BEGIN K:=
CURINPUT.LOCFIELD;BUFFER[CURINPUT.LIMITFIELD+1]:=34;
REPEAT CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
UNTIL BUFFER[CURINPUT.LOCFIELD]=34;
IF CURINPUT.LOCFIELD>CURINPUT.LIMITFIELD THEN{657:}
BEGIN CURINPUT.LOCFIELD:=CURINPUT.LIMITFIELD;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(507);END;
BEGIN HELPPTR:=3;HELPLINE[2]:=508;HELPLINE[1]:=509;HELPLINE[0]:=510;END;
DELETIONSALL:=FALSE;ERROR;DELETIONSALL:=TRUE;GOTO 20;END{:657};
IF CURINPUT.LOCFIELD=K+1 THEN CURMOD:=BUFFER[K]ELSE BEGIN BEGIN IF
POOLPTR+CURINPUT.LOCFIELD-K>MAXPOOLPTR THEN BEGIN IF POOLPTR+CURINPUT.
LOCFIELD-K>POOLSIZE THEN OVERFLOW(129,POOLSIZE-INITPOOLPTR);
MAXPOOLPTR:=POOLPTR+CURINPUT.LOCFIELD-K;END;END;
REPEAT BEGIN STRPOOL[POOLPTR]:=BUFFER[K];POOLPTR:=POOLPTR+1;END;K:=K+1;
UNTIL K=CURINPUT.LOCFIELD;CURMOD:=MAKESTRING;END;END;
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;CURCMD:=39;GOTO 10;END{:656};
5,6,7,8:BEGIN K:=CURINPUT.LOCFIELD-1;GOTO 40;END;20:{655:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(504);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=505;HELPLINE[0]:=506;END;
DELETIONSALL:=FALSE;ERROR;DELETIONSALL:=TRUE;GOTO 20;END{:655};
OTHERS:END;K:=CURINPUT.LOCFIELD-1;
WHILE CHARCLASS[BUFFER[CURINPUT.LOCFIELD]]=CLASS DO CURINPUT.LOCFIELD:=
CURINPUT.LOCFIELD+1;GOTO 40;85:{658:}N:=C-48;
WHILE CHARCLASS[BUFFER[CURINPUT.LOCFIELD]]=0 DO BEGIN IF N<4096 THEN N:=
10*N+BUFFER[CURINPUT.LOCFIELD]-48;
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;
IF BUFFER[CURINPUT.LOCFIELD]=46 THEN IF CHARCLASS[BUFFER[CURINPUT.
LOCFIELD+1]]=0 THEN GOTO 30;F:=0;GOTO 87;
30:CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1{:658};86:{659:}K:=0;
REPEAT IF K<17 THEN BEGIN DIG[K]:=BUFFER[CURINPUT.LOCFIELD]-48;K:=K+1;
END;CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
UNTIL CHARCLASS[BUFFER[CURINPUT.LOCFIELD]]<>0;F:=ROUNDDECIMAL(K);
IF F=65536 THEN BEGIN N:=N+1;F:=0;END{:659};87:{660:}
IF N<4096 THEN CURMOD:=N*65536+F ELSE BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(511);END;BEGIN HELPPTR:=2;
HELPLINE[1]:=512;HELPLINE[0]:=513;END;DELETIONSALL:=FALSE;ERROR;
DELETIONSALL:=TRUE;CURMOD:=268435455;END;CURCMD:=42;GOTO 10{:660};
40:CURSYM:=IDLOOKUP(K,CURINPUT.LOCFIELD-K);END{:654}ELSE{661:}
IF CURINPUT.LOCFIELD>=HIMEMMIN THEN BEGIN CURSYM:=MEM[CURINPUT.LOCFIELD]
.HH.LH;CURINPUT.LOCFIELD:=MEM[CURINPUT.LOCFIELD].HH.RH;
IF CURSYM>=2243 THEN IF CURSYM>=2393 THEN{662:}
BEGIN IF CURSYM>=2543 THEN CURSYM:=CURSYM-150;
BEGINTOKENLI(PARAMSTACK[CURINPUT.LIMITFIELD+CURSYM-(2393)],9);GOTO 20;
END{:662}ELSE BEGIN CURCMD:=38;
CURMOD:=PARAMSTACK[CURINPUT.LIMITFIELD+CURSYM-(2243)];CURSYM:=0;GOTO 10;
END;END ELSE IF CURINPUT.LOCFIELD>0 THEN{663:}
BEGIN IF MEM[CURINPUT.LOCFIELD].HH.B1=12 THEN BEGIN CURMOD:=MEM[CURINPUT
.LOCFIELD+1].INT;
IF MEM[CURINPUT.LOCFIELD].HH.B0=15 THEN CURCMD:=42 ELSE BEGIN CURCMD:=39
;BEGIN IF STRREF[CURMOD]<127 THEN STRREF[CURMOD]:=STRREF[CURMOD]+1;END;
END;END ELSE BEGIN CURMOD:=CURINPUT.LOCFIELD;CURCMD:=38;END;
CURINPUT.LOCFIELD:=MEM[CURINPUT.LOCFIELD].HH.RH;GOTO 10;END{:663}
ELSE BEGIN ENDTOKENLIST;GOTO 20;END{:661};{653:}CURCMD:=EQTB[CURSYM].LH;
CURMOD:=EQTB[CURSYM].RH;
IF CURCMD>=83 THEN IF CHECKOUTERVA THEN CURCMD:=CURCMD-83 ELSE GOTO 20{:
653};10:END;{:652}{667:}PROCEDURE FIRMUPTHELIN;VAR K:0..BUFSIZE;
BEGIN CURINPUT.LIMITFIELD:=LAST;
IF INTERNAL[30]>0 THEN IF INTERACTION>1 THEN IF BUFFER[CURINPUT.
STARTFIELD]<>12 THEN BEGIN BEGIN IF INSKP0 THEN END;PRINTLN;
IF CURINPUT.STARTFIELD=CURINPUT.LIMITFIELD THEN BEGIN BUFFER[CURINPUT.
STARTFIELD]:=32;CURINPUT.LIMITFIELD:=CURINPUT.LIMITFIELD+1;END;
SELECTOR:=SELECTOR-1;
FOR K:=CURINPUT.STARTFIELD TO CURINPUT.LIMITFIELD-1 DO BEGIN PRINTCHAR(
BUFFER[K]);PTWR1W(0,ORD(XCHR[BUFFER[K]]));END;PRINT(516);
FIRST:=CURINPUT.STARTFIELD;IF NOT INPUTLN(TTY,TRUE)THEN FATALERROR(132);
IF LAST>FIRST THEN FOR K:=FIRST TO LAST-1 DO PRINTCHAR(BUFFER[K]);
CURINPUT.LIMITFIELD:=LAST;PRINTLN;SELECTOR:=SELECTOR+1;END;END;{:667}
{670:}FUNCTION SCANTOKS(TERMINATOR:COMMANDCODE;
SUBSTLIST,TAILEND:HALFWORD;SUFFIXCOUNT:SMALLNUMBER):HALFWORD;
LABEL 30,40;VAR P:HALFWORD;Q:HALFWORD;BALANCE:INTEGER;BEGIN P:=2999;
BALANCE:=1;MEM[2999].HH.RH:=0;WHILE TRUE DO BEGIN GETNEXT;
IF CURSYM>0 THEN BEGIN{671:}BEGIN Q:=SUBSTLIST;
WHILE Q<>0 DO BEGIN IF MEM[Q].HH.LH=CURSYM THEN BEGIN CURSYM:=MEM[Q+1].
INT;CURCMD:=7;GOTO 40;END;Q:=MEM[Q].HH.RH;END;40:END{:671};
IF CURCMD=TERMINATOR THEN{672:}
IF CURMOD>0 THEN BALANCE:=BALANCE+1 ELSE BEGIN BALANCE:=BALANCE-1;
IF BALANCE=0 THEN GOTO 30;END{:672}ELSE IF CURCMD=62 THEN{675:}
BEGIN IF CURMOD=0 THEN GETNEXT ELSE IF CURMOD<=SUFFIXCOUNT THEN CURSYM:=
2392+CURMOD;END{:675};END;MEM[P].HH.RH:=CURTOK;P:=MEM[P].HH.RH;END;
30:MEM[P].HH.RH:=TAILEND;FLUSHNODELIS(SUBSTLIST);
SCANTOKS:=MEM[2999].HH.RH;END;{:670}{676:}PROCEDURE GETSYMBOL;LABEL 20;
BEGIN 20:GETNEXT;
IF(CURSYM=0)OR(CURSYM>2229)THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(528);END;BEGIN HELPPTR:=3;
HELPLINE[2]:=529;HELPLINE[1]:=530;HELPLINE[0]:=531;END;
IF CURSYM>0 THEN HELPLINE[2]:=532 ELSE IF CURCMD=39 THEN BEGIN IF STRREF
[CURMOD]<127 THEN IF STRREF[CURMOD]>1 THEN STRREF[CURMOD]:=STRREF[CURMOD
]-1 ELSE FLUSHSTRING(CURMOD);END;CURSYM:=2229;INSERROR;GOTO 20;END;END;
{:676}{677:}PROCEDURE GETCLEARSYMB;BEGIN GETSYMBOL;
CLEARSYMBOL(CURSYM,FALSE);END;{:677}{678:}PROCEDURE CHECKEQUALS;
BEGIN IF CURCMD<>51 THEN IF CURCMD<>77 THEN BEGIN MISSINGERR(61);
BEGIN HELPPTR:=5;HELPLINE[4]:=533;HELPLINE[3]:=534;HELPLINE[2]:=535;
HELPLINE[1]:=536;HELPLINE[0]:=537;END;BACKERROR;END;END;{:678}{679:}
PROCEDURE MAKEOPDEF;VAR M:COMMANDCODE;P,Q,R:HALFWORD;BEGIN M:=CURMOD;
GETSYMBOL;P:=GETNODE(2);MEM[P].HH.LH:=CURSYM;MEM[P+1].INT:=2243;
GETCLEARSYMB;WARNINGINFO:=CURSYM;GETSYMBOL;Q:=GETNODE(2);
MEM[Q].HH.LH:=CURSYM;MEM[Q+1].INT:=2244;MEM[P].HH.RH:=Q;GETNEXT;
CHECKEQUALS;SCANNERSTATU:=5;Q:=GETAVAIL;MEM[Q].HH.LH:=0;R:=GETAVAIL;
MEM[Q].HH.RH:=R;MEM[R].HH.LH:=0;MEM[R].HH.RH:=SCANTOKS(16,P,0,0);
SCANNERSTATU:=0;EQTB[WARNINGINFO].LH:=M;EQTB[WARNINGINFO].RH:=Q;
GETXNEXT;END;{:679}{682:}{1013:}
PROCEDURE CHECKDELIMIT(LDELIM,RDELIM:HALFWORD);LABEL 10;
BEGIN IF CURCMD=63 THEN IF CURMOD=LDELIM THEN GOTO 10;
IF CURSYM<>RDELIM THEN BEGIN MISSINGERR(HASH[RDELIM].RH);
BEGIN HELPPTR:=2;HELPLINE[1]:=782;HELPLINE[0]:=783;END;BACKERROR;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(784);END;PRINT(HASH[RDELIM].RH);PRINT(785);BEGIN HELPPTR:=3;
HELPLINE[2]:=786;HELPLINE[1]:=787;HELPLINE[0]:=788;END;ERROR;END;10:END;
{:1013}{993:}FUNCTION SCANDECLARED:HALFWORD;LABEL 30;VAR X:HALFWORD;
H,T:HALFWORD;L:HALFWORD;BEGIN GETSYMBOL;X:=CURSYM;
IF CURCMD<>41 THEN CLEARSYMBOL(X,FALSE);IF EQTB[X].RH=0 THEN NEWROOT(X);
H:=GETAVAIL;MEM[H].HH.LH:=X;T:=H;WHILE TRUE DO BEGIN GETXNEXT;
IF CURSYM=0 THEN GOTO 30;
IF CURCMD<>41 THEN IF CURCMD<>40 THEN IF CURCMD=53 THEN{994:}
BEGIN L:=CURSYM;GETXNEXT;IF CURCMD<>64 THEN BEGIN BACKINPUT;CURSYM:=L;
CURCMD:=53;GOTO 30;END ELSE CURSYM:=0;END{:994}ELSE GOTO 30;
MEM[T].HH.RH:=GETAVAIL;T:=MEM[T].HH.RH;MEM[T].HH.LH:=CURSYM;END;
30:SCANDECLARED:=H;END;{:993}PROCEDURE SCANDEF;VAR M:1..2;N:0..3;
K:0..150;C:0..7;R:HALFWORD;Q:HALFWORD;P:HALFWORD;BASE:HALFWORD;
LDELIM,RDELIM:HALFWORD;BEGIN M:=CURMOD;C:=0;MEM[2999].HH.RH:=0;
Q:=GETAVAIL;MEM[Q].HH.LH:=0;R:=0;{684:}IF M=1 THEN BEGIN GETCLEARSYMB;
WARNINGINFO:=CURSYM;GETNEXT;SCANNERSTATU:=5;N:=0;
EQTB[WARNINGINFO].LH:=10;EQTB[WARNINGINFO].RH:=Q;
END ELSE BEGIN P:=SCANDECLARED;
FLUSHVARIABL(EQTB[MEM[P].HH.LH].RH,MEM[P].HH.RH,TRUE);
WARNINGINFO:=FINDVARIABLE(P);FLUSHLIST(P);IF WARNINGINFO=0 THEN{685:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(544);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=545;HELPLINE[0]:=546;END;ERROR;
WARNINGINFO:=21;END{:685};SCANNERSTATU:=4;N:=2;
IF CURCMD=62 THEN IF CURMOD=3 THEN BEGIN N:=3;GETNEXT;END;
MEM[WARNINGINFO].HH.B0:=20+N;MEM[WARNINGINFO+1].INT:=Q;END{:684};K:=N;
IF CURCMD=31 THEN{687:}REPEAT LDELIM:=CURSYM;RDELIM:=CURMOD;GETNEXT;
IF(CURCMD=57)AND(CURMOD>=2243)THEN BASE:=CURMOD ELSE BEGIN BEGIN IF
INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(547);END;
BEGIN HELPPTR:=1;HELPLINE[0]:=548;END;BACKERROR;BASE:=2243;END;{688:}
REPEAT MEM[Q].HH.RH:=GETAVAIL;Q:=MEM[Q].HH.RH;MEM[Q].HH.LH:=BASE+K;
GETSYMBOL;P:=GETNODE(2);MEM[P+1].INT:=BASE+K;MEM[P].HH.LH:=CURSYM;
IF K=150 THEN OVERFLOW(549,150);K:=K+1;MEM[P].HH.RH:=R;R:=P;GETNEXT;
UNTIL CURCMD<>79{:688};CHECKDELIMIT(LDELIM,RDELIM);GETNEXT;
UNTIL CURCMD<>31{:687};IF CURCMD=57 THEN{689:}BEGIN P:=GETNODE(2);
IF CURMOD<2243 THEN BEGIN C:=CURMOD;MEM[P+1].INT:=2243+K;
END ELSE BEGIN MEM[P+1].INT:=CURMOD+K;
IF CURMOD=2243 THEN C:=4 ELSE IF CURMOD=2393 THEN C:=6 ELSE C:=7;END;
IF K=150 THEN OVERFLOW(549,150);K:=K+1;GETSYMBOL;MEM[P].HH.LH:=CURSYM;
MEM[P].HH.RH:=R;R:=P;GETNEXT;IF C=4 THEN IF CURCMD=69 THEN BEGIN C:=5;
P:=GETNODE(2);IF K=150 THEN OVERFLOW(549,150);MEM[P+1].INT:=2243+K;
GETSYMBOL;MEM[P].HH.LH:=CURSYM;MEM[P].HH.RH:=R;R:=P;GETNEXT;END;
END{:689};CHECKEQUALS;P:=GETAVAIL;MEM[P].HH.LH:=C;MEM[Q].HH.RH:=P;{683:}
IF M=1 THEN MEM[P].HH.RH:=SCANTOKS(16,R,0,N)ELSE BEGIN Q:=GETAVAIL;
MEM[Q].HH.LH:=2239;MEM[P].HH.RH:=Q;P:=GETAVAIL;MEM[P].HH.LH:=2240;
MEM[Q].HH.RH:=SCANTOKS(16,R,P,N);END;
IF WARNINGINFO=21 THEN FLUSHTOKENLI(MEM[22].INT){:683};SCANNERSTATU:=0;
GETXNEXT;END;{:682}{690:}PROCEDURE SCANPRIMARY;FORWARD;
PROCEDURE SCANSECONDAR;FORWARD;PROCEDURE SCANTERTIARY;FORWARD;
PROCEDURE SCANEXPRESSI;FORWARD;PROCEDURE SCANSUFFIX;FORWARD;{704:}{706:}
PROCEDURE PRINTMACRONA(A,N:HALFWORD);VAR P,Q:HALFWORD;
BEGIN IF N<>0 THEN PRINT(HASH[N].RH)ELSE BEGIN P:=MEM[A].HH.LH;
IF P=0 THEN PRINT(HASH[MEM[MEM[MEM[A].HH.RH].HH.LH].HH.LH].RH)ELSE BEGIN
Q:=P;WHILE MEM[Q].HH.RH<>0 DO Q:=MEM[Q].HH.RH;
MEM[Q].HH.RH:=MEM[MEM[A].HH.RH].HH.LH;SHOWTOKENLIS(P,0,1000);
MEM[Q].HH.RH:=0;END;END;END;{:706}{707:}PROCEDURE PRINTARG(Q:HALFWORD;
N:INTEGER;B:HALFWORD);
BEGIN IF MEM[Q].HH.RH=1 THEN PRINTNL(367)ELSE IF(B<2543)AND(B<>7)THEN
PRINTNL(368)ELSE PRINTNL(369);PRINTINT(N);PRINT(565);
IF MEM[Q].HH.RH=1 THEN PRINTEXP(Q,1)ELSE SHOWTOKENLIS(Q,0,1000);END;
{:707}{714:}PROCEDURE SCANTEXTARG(LDELIM,RDELIM:HALFWORD);LABEL 30;
VAR BALANCE:INTEGER;P:HALFWORD;BEGIN WARNINGINFO:=LDELIM;
SCANNERSTATU:=3;P:=2999;BALANCE:=1;MEM[2999].HH.RH:=0;
WHILE TRUE DO BEGIN GETNEXT;IF LDELIM=0 THEN{716:}
BEGIN IF CURCMD>79 THEN BEGIN IF BALANCE=1 THEN GOTO 30 ELSE IF CURCMD=
81 THEN BALANCE:=BALANCE-1;
END ELSE IF CURCMD=32 THEN BALANCE:=BALANCE+1;END{:716}ELSE{715:}
BEGIN IF CURCMD=63 THEN BEGIN IF CURMOD=LDELIM THEN BEGIN BALANCE:=
BALANCE-1;IF BALANCE=0 THEN GOTO 30;END;
END ELSE IF CURCMD=31 THEN IF CURMOD=RDELIM THEN BALANCE:=BALANCE+1;
END{:715};MEM[P].HH.RH:=CURTOK;P:=MEM[P].HH.RH;END;
30:CUREXP:=MEM[2999].HH.RH;CURTYPE:=20;SCANNERSTATU:=0;END;{:714}
PROCEDURE MACROCALL(DEFREF,ARGLIST,MACRONAME:HALFWORD);LABEL 40;
VAR R:HALFWORD;P,Q:HALFWORD;N:INTEGER;LDELIM,RDELIM:HALFWORD;
TAIL:HALFWORD;BEGIN R:=MEM[DEFREF].HH.RH;
MEM[DEFREF].HH.LH:=MEM[DEFREF].HH.LH+1;IF ARGLIST=0 THEN N:=0 ELSE{708:}
BEGIN N:=1;TAIL:=ARGLIST;WHILE MEM[TAIL].HH.RH<>0 DO BEGIN N:=N+1;
TAIL:=MEM[TAIL].HH.RH;END;END{:708};IF INTERNAL[8]>0 THEN{705:}
BEGIN BEGINDIAGNOS;PRINTLN;PRINTMACRONA(ARGLIST,MACRONAME);
IF N=3 THEN PRINT(527);SHOWMACRO(DEFREF,0,1000);
IF ARGLIST<>0 THEN BEGIN N:=0;P:=ARGLIST;REPEAT Q:=MEM[P].HH.LH;
PRINTARG(Q,N,0);N:=N+1;P:=MEM[P].HH.RH;UNTIL P=0;END;
ENDDIAGNOSTI(FALSE);END{:705};{709:}CURCMD:=80;
WHILE MEM[R].HH.LH>=2243 DO BEGIN{710:}
IF CURCMD<>79 THEN BEGIN GETXNEXT;
IF CURCMD<>31 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(571);END;PRINTMACRONA(ARGLIST,MACRONAME);
BEGIN HELPPTR:=3;HELPLINE[2]:=572;HELPLINE[1]:=573;HELPLINE[0]:=574;END;
IF MEM[R].HH.LH>=2393 THEN BEGIN CUREXP:=0;CURTYPE:=20;
END ELSE BEGIN CUREXP:=0;CURTYPE:=15;END;BACKERROR;CURCMD:=63;GOTO 40;
END;LDELIM:=CURSYM;RDELIM:=CURMOD;END;{713:}
IF MEM[R].HH.LH>=2543 THEN SCANTEXTARG(LDELIM,RDELIM)ELSE BEGIN GETXNEXT
;IF MEM[R].HH.LH>=2393 THEN SCANSUFFIX ELSE SCANEXPRESSI;END{:713};
IF CURCMD<>79 THEN{711:}
IF(CURCMD<>63)OR(CURMOD<>LDELIM)THEN IF MEM[MEM[R].HH.RH].HH.LH>=2243
THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=3;HELPLINE[2]:=575;
HELPLINE[1]:=576;HELPLINE[0]:=570;END;BACKERROR;CURCMD:=79;
END ELSE BEGIN MISSINGERR(HASH[RDELIM].RH);BEGIN HELPPTR:=2;
HELPLINE[1]:=577;HELPLINE[0]:=570;END;BACKERROR;END{:711};40:{712:}
BEGIN P:=GETAVAIL;
IF CURTYPE=20 THEN MEM[P].HH.LH:=CUREXP ELSE MEM[P].HH.LH:=STASHCUREXP;
IF INTERNAL[8]>0 THEN BEGIN BEGINDIAGNOS;
PRINTARG(MEM[P].HH.LH,N,MEM[R].HH.LH);ENDDIAGNOSTI(FALSE);END;
IF ARGLIST=0 THEN ARGLIST:=P ELSE MEM[TAIL].HH.RH:=P;TAIL:=P;N:=N+1;
END{:712}{:710};R:=MEM[R].HH.RH;END;
IF CURCMD=79 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(566);END;PRINTMACRONA(ARGLIST,MACRONAME);
PRINTCHAR(59);PRINTNL(567);PRINT(HASH[RDELIM].RH);PRINT(172);
BEGIN HELPPTR:=3;HELPLINE[2]:=568;HELPLINE[1]:=569;HELPLINE[0]:=570;END;
ERROR;END;IF MEM[R].HH.LH<>0 THEN{717:}
BEGIN IF MEM[R].HH.LH<7 THEN BEGIN GETXNEXT;
IF MEM[R].HH.LH<>6 THEN IF(CURCMD=51)OR(CURCMD=77)THEN GETXNEXT;END;
CASE MEM[R].HH.LH OF 1:SCANPRIMARY;2:SCANSECONDAR;3:SCANTERTIARY;
4:SCANEXPRESSI;5:{718:}BEGIN SCANEXPRESSI;P:=GETAVAIL;
MEM[P].HH.LH:=STASHCUREXP;IF INTERNAL[8]>0 THEN BEGIN BEGINDIAGNOS;
PRINTARG(MEM[P].HH.LH,N,0);ENDDIAGNOSTI(FALSE);END;
IF ARGLIST=0 THEN ARGLIST:=P ELSE MEM[TAIL].HH.RH:=P;TAIL:=P;N:=N+1;
IF CURCMD<>69 THEN BEGIN MISSINGERR(349);PRINT(578);
PRINTMACRONA(ARGLIST,MACRONAME);BEGIN HELPPTR:=1;HELPLINE[0]:=579;END;
BACKERROR;END;GETXNEXT;SCANPRIMARY;END{:718};6:{719:}
BEGIN IF CURCMD<>31 THEN LDELIM:=0 ELSE BEGIN LDELIM:=CURSYM;
RDELIM:=CURMOD;GETXNEXT;END;SCANSUFFIX;
IF LDELIM<>0 THEN BEGIN IF(CURCMD<>63)OR(CURMOD<>LDELIM)THEN BEGIN
MISSINGERR(HASH[RDELIM].RH);BEGIN HELPPTR:=2;HELPLINE[1]:=577;
HELPLINE[0]:=570;END;BACKERROR;END;GETXNEXT;END;END{:719};
7:SCANTEXTARG(0,0);END;BACKINPUT;{712:}BEGIN P:=GETAVAIL;
IF CURTYPE=20 THEN MEM[P].HH.LH:=CUREXP ELSE MEM[P].HH.LH:=STASHCUREXP;
IF INTERNAL[8]>0 THEN BEGIN BEGINDIAGNOS;
PRINTARG(MEM[P].HH.LH,N,MEM[R].HH.LH);ENDDIAGNOSTI(FALSE);END;
IF ARGLIST=0 THEN ARGLIST:=P ELSE MEM[TAIL].HH.RH:=P;TAIL:=P;N:=N+1;
END{:712};END{:717};R:=MEM[R].HH.RH{:709};{720:}
WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.LOCFIELD=0)DO ENDTOKENLIST;
IF PARAMPTR+N>MAXPARAMSTAC THEN BEGIN MAXPARAMSTAC:=PARAMPTR+N;
IF MAXPARAMSTAC>150 THEN OVERFLOW(549,150);END;BEGINTOKENLI(DEFREF,12);
CURINPUT.NAMEFIELD:=MACRONAME;CURINPUT.LOCFIELD:=R;
IF N>0 THEN BEGIN P:=ARGLIST;REPEAT PARAMSTACK[PARAMPTR]:=MEM[P].HH.LH;
PARAMPTR:=PARAMPTR+1;P:=MEM[P].HH.RH;UNTIL P=0;FLUSHLIST(ARGLIST);
END{:720};END;{:704}PROCEDURE GETBOOLEAN;FORWARD;PROCEDURE PASSTEXT;
FORWARD;PROCEDURE CONDITIONAL;FORWARD;PROCEDURE STARTINPUT;FORWARD;
PROCEDURE BEGINITERATI;FORWARD;PROCEDURE RESUMEITERAT;FORWARD;
PROCEDURE STOPITERATIO;FORWARD;{:690}{691:}PROCEDURE EXPAND;
VAR P:HALFWORD;K:INTEGER;J:POOLPOINTER;
BEGIN IF INTERNAL[7]>65536 THEN IF CURCMD<>10 THEN SHOWCMDMOD(CURCMD,
CURMOD);CASE CURCMD OF 1:CONDITIONAL;2:{735:}
IF CURMOD>IFLIMIT THEN IF IFLIMIT=1 THEN BEGIN MISSINGERR(58);BACKINPUT;
CURSYM:=2234;INSERROR;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(586);END;PRINTCMDMOD(2,CURMOD);BEGIN HELPPTR:=1;HELPLINE[0]:=587;
END;ERROR;END ELSE BEGIN WHILE CURMOD<>2 DO PASSTEXT;{729:}
BEGIN P:=CONDPTR;IFLINE:=MEM[P+1].INT;CURIF:=MEM[P].HH.B1;
IFLIMIT:=MEM[P].HH.B0;CONDPTR:=MEM[P].HH.RH;FREENODE(P,2);END{:729};
END{:735};3:{695:}IF CURMOD>0 THEN FORCEEOF:=TRUE ELSE STARTINPUT{:695};
4:IF CURMOD=0 THEN{692:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(550);END;BEGIN HELPPTR:=2;HELPLINE[1]:=551;
HELPLINE[0]:=552;END;ERROR;END{:692}ELSE BEGINITERATI;5:{696:}
BEGIN WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.LOCFIELD=0)DO
ENDTOKENLIST;
IF LOOPPTR=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(554);END;BEGIN HELPPTR:=2;HELPLINE[1]:=555;
HELPLINE[0]:=556;END;ERROR;END ELSE RESUMEITERAT;END{:696};6:{697:}
BEGIN GETBOOLEAN;IF INTERNAL[7]>65536 THEN SHOWCMDMOD(33,CUREXP);
IF CUREXP=30 THEN IF LOOPPTR=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(557);END;BEGIN HELPPTR:=1;
HELPLINE[0]:=558;END;IF CURCMD=80 THEN ERROR ELSE BACKERROR;
END ELSE{698:}BEGIN P:=0;
REPEAT IF(CURINPUT.INDEXFIELD<=6)THEN ENDFILEREADI ELSE BEGIN IF
CURINPUT.INDEXFIELD<=8 THEN P:=CURINPUT.STARTFIELD;ENDTOKENLIST;END;
UNTIL P<>0;IF P<>MEM[LOOPPTR].HH.LH THEN FATALERROR(561);STOPITERATIO;
END{:698}ELSE IF CURCMD<>80 THEN BEGIN MISSINGERR(59);BEGIN HELPPTR:=2;
HELPLINE[1]:=559;HELPLINE[0]:=560;END;BACKERROR;END;END{:697};7:;
9:{699:}BEGIN GETNEXT;P:=CURTOK;GETNEXT;
IF CURCMD<11 THEN EXPAND ELSE BACKINPUT;BEGINTOKENLI(P,10);END{:699};
8:{700:}BEGIN GETXNEXT;SCANPRIMARY;
IF CURTYPE<>4 THEN BEGIN DISPERR(0,562);BEGIN HELPPTR:=2;
HELPLINE[1]:=563;HELPLINE[0]:=564;END;PUTGETFLUSHE(0);
END ELSE BEGIN BACKINPUT;
IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])>0 THEN{701:}BEGIN BEGINFILEREA;
CURINPUT.NAMEFIELD:=2;K:=FIRST+(STRSTART[CUREXP+1]-STRSTART[CUREXP]);
IF K>=MAXBUFSTACK THEN BEGIN IF K>=BUFSIZE THEN BEGIN MAXBUFSTACK:=
BUFSIZE;OVERFLOW(128,BUFSIZE);END;MAXBUFSTACK:=K+1;END;
J:=STRSTART[CUREXP];CURINPUT.LIMITFIELD:=K;
WHILE FIRST<CURINPUT.LIMITFIELD DO BEGIN BUFFER[FIRST]:=STRPOOL[J];
J:=J+1;FIRST:=FIRST+1;END;BUFFER[CURINPUT.LIMITFIELD]:=37;
FIRST:=CURINPUT.LIMITFIELD+1;CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;
FLUSHCUREXP(0);END{:701};END;END{:700};10:MACROCALL(CURMOD,0,CURSYM);
END;END;{:691}{702:}PROCEDURE GETXNEXT;VAR SAVEEXP:HALFWORD;
BEGIN GETNEXT;IF CURCMD<11 THEN BEGIN SAVEEXP:=STASHCUREXP;
REPEAT IF CURCMD=10 THEN MACROCALL(CURMOD,0,CURSYM)ELSE EXPAND;GETNEXT;
UNTIL CURCMD>=11;UNSTASHCUREX(SAVEEXP);END;END;{:702}{721:}
PROCEDURE STACKARGUMEN(P:HALFWORD);
BEGIN IF PARAMPTR=MAXPARAMSTAC THEN BEGIN MAXPARAMSTAC:=MAXPARAMSTAC+1;
IF MAXPARAMSTAC>150 THEN OVERFLOW(549,150);END;PARAMSTACK[PARAMPTR]:=P;
PARAMPTR:=PARAMPTR+1;END;{:721}{726:}PROCEDURE PASSTEXT;LABEL 30;
VAR L:INTEGER;BEGIN SCANNERSTATU:=1;L:=0;WARNINGINFO:=LINE;
WHILE TRUE DO BEGIN GETNEXT;
IF CURCMD<=2 THEN IF CURCMD<2 THEN L:=L+1 ELSE BEGIN IF L=0 THEN GOTO 30
;IF CURMOD=2 THEN L:=L-1;END ELSE{727:}
IF CURCMD=39 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:727}
;END;30:SCANNERSTATU:=0;END;{:726}{730:}
PROCEDURE CHANGEIFLIMI(L:SMALLNUMBER;P:HALFWORD);LABEL 10;
VAR Q:HALFWORD;BEGIN IF P=CONDPTR THEN IFLIMIT:=L ELSE BEGIN Q:=CONDPTR;
WHILE TRUE DO BEGIN IF Q=0 THEN CONFUSION(580);
IF MEM[Q].HH.RH=P THEN BEGIN MEM[Q].HH.B0:=L;GOTO 10;END;
Q:=MEM[Q].HH.RH;END;END;10:END;{:730}{731:}PROCEDURE CHECKCOLON;
BEGIN IF CURCMD<>78 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=2;
HELPLINE[1]:=583;HELPLINE[0]:=560;END;BACKERROR;END;END;{:731}{732:}
PROCEDURE CONDITIONAL;LABEL 10,30,21,40;VAR SAVECONDPTR:HALFWORD;
NEWIFLIMIT:2..4;P:HALFWORD;BEGIN{728:}BEGIN P:=GETNODE(2);
MEM[P].HH.RH:=CONDPTR;MEM[P].HH.B0:=IFLIMIT;MEM[P].HH.B1:=CURIF;
MEM[P+1].INT:=IFLINE;CONDPTR:=P;IFLIMIT:=1;IFLINE:=LINE;CURIF:=1;
END{:728};SAVECONDPTR:=CONDPTR;21:GETBOOLEAN;NEWIFLIMIT:=4;
IF INTERNAL[7]>65536 THEN{734:}BEGIN BEGINDIAGNOS;
IF CUREXP=30 THEN PRINT(584)ELSE PRINT(585);ENDDIAGNOSTI(FALSE);
END{:734};40:CHECKCOLON;
IF CUREXP=30 THEN BEGIN CHANGEIFLIMI(NEWIFLIMIT,SAVECONDPTR);GOTO 10;
END;{733:}WHILE TRUE DO BEGIN PASSTEXT;
IF CONDPTR=SAVECONDPTR THEN GOTO 30 ELSE IF CURMOD=2 THEN{729:}
BEGIN P:=CONDPTR;IFLINE:=MEM[P+1].INT;CURIF:=MEM[P].HH.B1;
IFLIMIT:=MEM[P].HH.B0;CONDPTR:=MEM[P].HH.RH;FREENODE(P,2);END{:729};
END{:733};30:CURIF:=CURMOD;IFLINE:=LINE;IF CURMOD=2 THEN{729:}
BEGIN P:=CONDPTR;IFLINE:=MEM[P+1].INT;CURIF:=MEM[P].HH.B1;
IFLIMIT:=MEM[P].HH.B0;CONDPTR:=MEM[P].HH.RH;FREENODE(P,2);END{:729}
ELSE IF CURMOD=4 THEN GOTO 21 ELSE BEGIN CUREXP:=30;NEWIFLIMIT:=2;
GETXNEXT;GOTO 40;END;10:END;{:732}{738:}PROCEDURE BADFOR(S:STRNUMBER);
BEGIN DISPERR(0,588);PRINT(S);PRINT(179);BEGIN HELPPTR:=4;
HELPLINE[3]:=589;HELPLINE[2]:=590;HELPLINE[1]:=591;HELPLINE[0]:=181;END;
PUTGETFLUSHE(0);END;{:738}{739:}PROCEDURE BEGINITERATI;LABEL 30,40;
VAR M:HALFWORD;N:HALFWORD;P,Q,S,PP:HALFWORD;BEGIN M:=CURMOD;N:=CURSYM;
S:=GETNODE(2);IF M=1 THEN BEGIN MEM[S+1].HH.LH:=1;P:=0;GETXNEXT;GOTO 40;
END;GETSYMBOL;P:=GETNODE(2);MEM[P].HH.LH:=CURSYM;MEM[P+1].INT:=M;
GETXNEXT;IF(CURCMD<>51)AND(CURCMD<>77)THEN BEGIN MISSINGERR(61);
BEGIN HELPPTR:=3;HELPLINE[2]:=592;HELPLINE[1]:=535;HELPLINE[0]:=593;END;
BACKERROR;END;{748:}Q:=S+1;REPEAT GETXNEXT;
IF M<>2243 THEN SCANSUFFIX ELSE BEGIN SCANEXPRESSI;
IF CURCMD=74 THEN IF Q=S+1 THEN{749:}
BEGIN IF CURTYPE<>15 THEN BADFOR(599);PP:=GETNODE(4);
MEM[PP+1].INT:=CUREXP;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>15 THEN BADFOR(600);MEM[PP+2].INT:=CUREXP;
IF CURCMD<>75 THEN BEGIN MISSINGERR(359);BEGIN HELPPTR:=2;
HELPLINE[1]:=601;HELPLINE[0]:=602;END;BACKERROR;END;GETXNEXT;
SCANEXPRESSI;IF CURTYPE<>15 THEN BADFOR(603);MEM[PP+3].INT:=CUREXP;
MEM[S+1].HH.LH:=PP;GOTO 30;END{:749};CUREXP:=STASHCUREXP;END;
MEM[Q].HH.RH:=GETAVAIL;Q:=MEM[Q].HH.RH;MEM[Q].HH.LH:=CUREXP;CURTYPE:=1;
UNTIL CURCMD<>79;MEM[S+1].HH.LH:=0;30:{:748};40:{740:}
IF CURCMD<>78 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=3;
HELPLINE[2]:=594;HELPLINE[1]:=595;HELPLINE[0]:=596;END;BACKERROR;
END{:740};{742:}Q:=GETAVAIL;MEM[Q].HH.LH:=2230;SCANNERSTATU:=6;
WARNINGINFO:=N;MEM[S].HH.LH:=SCANTOKS(4,P,Q,0);SCANNERSTATU:=0;
MEM[S].HH.RH:=LOOPPTR;LOOPPTR:=S{:742};RESUMEITERAT;END;{:739}{744:}
PROCEDURE RESUMEITERAT;LABEL 45,10;VAR P,Q:HALFWORD;
BEGIN P:=MEM[LOOPPTR+1].HH.LH;IF P>1 THEN BEGIN CUREXP:=MEM[P+1].INT;
IF{745:}
((MEM[P+2].INT>0)AND(CUREXP>MEM[P+3].INT))OR((MEM[P+2].INT<0)AND(CUREXP<
MEM[P+3].INT)){:745}THEN GOTO 45;CURTYPE:=15;Q:=STASHCUREXP;
MEM[P+1].INT:=CUREXP+MEM[P+2].INT;
END ELSE IF P<1 THEN BEGIN P:=MEM[LOOPPTR+1].HH.RH;IF P=0 THEN GOTO 45;
MEM[LOOPPTR+1].HH.RH:=MEM[P].HH.RH;Q:=MEM[P].HH.LH;
BEGIN MEM[P].HH.RH:=AVAIL;AVAIL:=P;DYNUSED:=DYNUSED-1;END;
END ELSE BEGIN BEGINTOKENLI(MEM[LOOPPTR].HH.LH,7);GOTO 10;END;
BEGINTOKENLI(MEM[LOOPPTR].HH.LH,8);STACKARGUMEN(Q);
IF INTERNAL[7]>65536 THEN{746:}BEGIN BEGINDIAGNOS;PRINTNL(598);
IF(Q<>0)AND(MEM[Q].HH.RH=1)THEN PRINTEXP(Q,1)ELSE SHOWTOKENLIS(Q,0,50);
PRINTCHAR(125);ENDDIAGNOSTI(FALSE);END{:746};GOTO 10;45:STOPITERATIO;
10:END;{:744}{747:}PROCEDURE STOPITERATIO;VAR P,Q:HALFWORD;
BEGIN P:=MEM[LOOPPTR+1].HH.LH;
IF P>1 THEN FREENODE(P,4)ELSE IF P<1 THEN BEGIN Q:=MEM[LOOPPTR+1].HH.RH;
WHILE Q<>0 DO BEGIN P:=MEM[Q].HH.LH;
IF P<>0 THEN IF MEM[P].HH.RH=1 THEN BEGIN RECYCLEVALUE(P);FREENODE(P,2);
END ELSE FLUSHTOKENLI(P);P:=Q;Q:=MEM[Q].HH.RH;BEGIN MEM[P].HH.RH:=AVAIL;
AVAIL:=P;DYNUSED:=DYNUSED-1;END;END;END;P:=LOOPPTR;
LOOPPTR:=MEM[P].HH.RH;FLUSHTOKENLI(MEM[P].HH.LH);FREENODE(P,2);END;
{:747}{754:}PROCEDURE BEGINNAME;BEGIN AREADELIMITE:=0;EXTDELIMITER:=0;
END;{:754}{755:}FUNCTION MORENAME(C:ASCIICODE):BOOLEAN;
BEGIN IF C=32 THEN MORENAME:=FALSE ELSE BEGIN IF C=91 THEN AREADELIMITE
:=POOLPTR ELSE IF C=46 THEN EXTDELIMITER:=POOLPTR;
BEGIN IF POOLPTR+1>MAXPOOLPTR THEN BEGIN IF POOLPTR+1>POOLSIZE THEN
OVERFLOW(129,POOLSIZE-INITPOOLPTR);MAXPOOLPTR:=POOLPTR+1;END;END;
BEGIN STRPOOL[POOLPTR]:=C;POOLPTR:=POOLPTR+1;END;MORENAME:=TRUE;END;END;
{:755}{756:}PROCEDURE ENDNAME;
BEGIN IF STRPTR+3>MAXSTRPTR THEN BEGIN IF STRPTR+3>MAXSTRINGS THEN
OVERFLOW(130,MAXSTRINGS-INITSTRPTR);MAXSTRPTR:=STRPTR+3;END;
CURNAME:=STRPTR;
IF EXTDELIMITER=0 THEN CUREXT:=157 ELSE BEGIN STRPTR:=STRPTR+1;
STRSTART[STRPTR]:=EXTDELIMITER;CUREXT:=STRPTR;END;
IF AREADELIMITE<=STRSTART[STRPTR]THEN BEGIN CURAREA:=157;
STRPTR:=STRPTR+1;STRSTART[STRPTR]:=POOLPTR;
END ELSE BEGIN STRPTR:=STRPTR+1;STRSTART[STRPTR]:=AREADELIMITE;
CURAREA:=MAKESTRING;END;END;{:756}{758:}
PROCEDURE PACKFILENAME(N,A,E:STRNUMBER);VAR K:INTEGER;C:ASCIICODE;
J:POOLPOINTER;BEGIN K:=0;J:=605;
FOR J:=STRSTART[N]TO STRSTART[N+1]-1 DO BEGIN C:=STRPOOL[J];K:=K+1;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
FOR J:=STRSTART[E]TO STRSTART[E+1]-1 DO BEGIN C:=STRPOOL[J];K:=K+1;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
FOR J:=STRSTART[A]TO STRSTART[A+1]-1 DO BEGIN C:=STRPOOL[J];K:=K+1;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
IF K<=FILENAMESIZE THEN NAMELENGTH:=K ELSE NAMELENGTH:=FILENAMESIZE;
FOR K:=NAMELENGTH+1 TO FILENAMESIZE DO NAMEOFFILE[K]:=' ';END;{:758}
{762:}PROCEDURE PACKBUFFERED(N:SMALLNUMBER;A,B:INTEGER);VAR K:INTEGER;
C:ASCIICODE;J:INTEGER;D:INTEGER;
BEGIN IF N+B-A+5>FILENAMESIZE THEN B:=A+FILENAMESIZE-N-5;K:=0;
FOR J:=A TO B DO BEGIN C:=BUFFER[J];K:=K+1;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
IF B=0 THEN BEGIN D:=10;N:=17;END ELSE D:=6;
FOR J:=D TO 9 DO BEGIN C:=XORD[MFBASEDEFAUL[J]];K:=K+1;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
FOR J:=17-N+1 TO 17 DO BEGIN C:=XORD[MFBASEDEFAUL[J]];K:=K+1;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
IF K<=FILENAMESIZE THEN NAMELENGTH:=K ELSE NAMELENGTH:=FILENAMESIZE;
FOR K:=NAMELENGTH+1 TO FILENAMESIZE DO NAMEOFFILE[K]:=' ';END;{:762}
{764:}FUNCTION MAKENAMESTRI:STRNUMBER;VAR K:1..FILENAMESIZE;
BEGIN BEGIN IF POOLPTR+NAMELENGTH>MAXPOOLPTR THEN BEGIN IF POOLPTR+
NAMELENGTH>POOLSIZE THEN OVERFLOW(129,POOLSIZE-INITPOOLPTR);
MAXPOOLPTR:=POOLPTR+NAMELENGTH;END;END;
FOR K:=1 TO NAMELENGTH DO BEGIN STRPOOL[POOLPTR]:=XORD[NAMEOFFILE[K]];
POOLPTR:=POOLPTR+1;END;MAKENAMESTRI:=MAKESTRING;END;
FUNCTION AMAKENAMESTR(VAR F:ALPHAFILE):STRNUMBER;
BEGIN AMAKENAMESTR:=MAKENAMESTRI;END;
FUNCTION BMAKENAMESTR(VAR F:BYTEFILE):STRNUMBER;
BEGIN BMAKENAMESTR:=MAKENAMESTRI;END;
FUNCTION WMAKENAMESTR(VAR F:WORDFILE):STRNUMBER;
BEGIN WMAKENAMESTR:=MAKENAMESTRI;END;{:764}{765:}PROCEDURE SCANFILENAME;
LABEL 30;BEGIN BEGINNAME;
WHILE BUFFER[CURINPUT.LOCFIELD]=32 DO CURINPUT.LOCFIELD:=CURINPUT.
LOCFIELD+1;
WHILE TRUE DO BEGIN IF(BUFFER[CURINPUT.LOCFIELD]=59)OR(BUFFER[CURINPUT.
LOCFIELD]=37)THEN GOTO 30;
IF NOT MORENAME(BUFFER[CURINPUT.LOCFIELD])THEN GOTO 30;
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;30:ENDNAME;END;{:765}{768:}
PROCEDURE PACKJOBNAME(S:STRNUMBER);BEGIN CURAREA:=157;CUREXT:=S;
CURNAME:=JOBNAME;PACKFILENAME(CURNAME,CURAREA,CUREXT);END;{:768}{769:}
PROCEDURE PROMPTFILENA(S,E:STRNUMBER);LABEL 30;VAR K:0..BUFSIZE;
I:POOLPOINTER;BEGIN IF INTERACTION=2 THEN WAKEUPTERMIN;
IF S=606 THEN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(607);END ELSE BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(608);END;PRINTFILENAM(CURNAME,CURAREA,CUREXT);
PRINT(609);IF E=610 THEN SHOWCONTEXT;PRINTNL(611);PRINT(S);
IF INTERACTION<2 THEN FATALERROR(612);BREAKIN(TTY,TRUE);
FOR I:=STRSTART[CURNAME]TO STRSTART[CURNAME+1]-1 DO PTWR1W(0,ORD(XCHR[
STRPOOL[I]]));
FOR I:=STRSTART[CUREXT]TO STRSTART[CUREXT+1]-1 DO PTWR1W(0,ORD(XCHR[
STRPOOL[I]]));
FOR I:=STRSTART[CURAREA]TO STRSTART[CURAREA+1]-1 DO PTWR1W(0,ORD(XCHR[
STRPOOL[I]]));PTWR1W(0,140);BEGIN BEGIN IF INSKP0 THEN END;PRINT(613);
TERMINPUT;END;{770:}BEGIN BEGINNAME;K:=FIRST;
WHILE(BUFFER[K]=32)AND(K<LAST)DO K:=K+1;
WHILE TRUE DO BEGIN IF K=LAST THEN GOTO 30;
IF NOT MORENAME(BUFFER[K])THEN GOTO 30;K:=K+1;END;30:ENDNAME;END{:770};
IF CUREXT=157 THEN CUREXT:=E;PACKFILENAME(CURNAME,CURAREA,CUREXT);END;
{:769}{771:}PROCEDURE OPENLOGFILE;VAR OLDSETTING:0..5;K:0..BUFSIZE;
L:0..BUFSIZE;M:INTEGER;MONTHS:PACKED ARRAY[1..36]OF CHAR;
BEGIN OLDSETTING:=SELECTOR;IF JOBNAME=0 THEN JOBNAME:=614;
PACKJOBNAME(615);WHILE NOT AOPENOUT(LOGFILE)DO{772:}
BEGIN IF INTERACTION<2 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(608);END;
PRINTFILENAM(CURNAME,CURAREA,CUREXT);PRINT(609);JOBNAME:=0;HISTORY:=3;
JUMPOUT;END;PROMPTFILENA(617,615);END{:772};
LOGNAME:=AMAKENAMESTR(LOGFILE);SELECTOR:=2;{773:}
BEGIN WRITE(LOGFILE,'This is METAFONT, Version 0.77');PRINT(BASEIDENT);
PRINT(618);PRINTINT(ROUNDUNSCALE(INTERNAL[15]));PRINTCHAR(32);
MONTHS:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
M:=ROUNDUNSCALE(INTERNAL[14]);
FOR K:=3*M-2 TO 3*M DO WRITE(LOGFILE,MONTHS[K]);PRINTCHAR(32);
PRINTINT(ROUNDUNSCALE(INTERNAL[13]));PRINTCHAR(32);
M:=ROUNDUNSCALE(INTERNAL[16]);PRINTDD(M DIV 60);PRINTCHAR(58);
PRINTDD(M MOD 60);END{:773};INPUTSTACK[INPUTPTR]:=CURINPUT;PRINTNL(616);
L:=INPUTSTACK[0].LIMITFIELD-1;FOR K:=1 TO L DO PRINT(BUFFER[K]);PRINTLN;
SELECTOR:=OLDSETTING+2;END;{:771}{776:}PROCEDURE STARTINPUT;LABEL 30;
BEGIN{778:}
WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.LOCFIELD=0)DO ENDTOKENLIST;
IF(CURINPUT.INDEXFIELD>6)THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(621);END;BEGIN HELPPTR:=3;
HELPLINE[2]:=622;HELPLINE[1]:=623;HELPLINE[0]:=624;END;ERROR;END;
IF(CURINPUT.INDEXFIELD<=6)THEN SCANFILENAME ELSE BEGIN CURNAME:=157;
CUREXT:=157;CURAREA:=157;END{:778};IF CUREXT=157 THEN CUREXT:=610;
PACKFILENAME(CURNAME,CURAREA,CUREXT);WHILE TRUE DO BEGIN BEGINFILEREA;
IF AOPENIN(INPUTFILE[CURINPUT.INDEXFIELD])THEN GOTO 30;
PACKFILENAME(CURNAME,604,CUREXT);
IF AOPENIN(INPUTFILE[CURINPUT.INDEXFIELD])THEN GOTO 30;ENDFILEREADI;
PROMPTFILENA(606,610);END;
30:CURINPUT.NAMEFIELD:=AMAKENAMESTR(INPUTFILE[CURINPUT.INDEXFIELD]);
STRREF[CURNAME]:=127;IF JOBNAME=0 THEN BEGIN JOBNAME:=CURNAME;
OPENLOGFILE;END;
IF TERMOFFSET+(STRSTART[CURINPUT.NAMEFIELD+1]-STRSTART[CURINPUT.
NAMEFIELD])>MAXPRINTLINE-2 THEN PRINTLN ELSE IF(TERMOFFSET>0)OR(
FILEOFFSET>0)THEN PRINTCHAR(32);PRINTCHAR(40);PRINT(CURINPUT.NAMEFIELD);
BREAK(TTY);
IF CURINPUT.NAMEFIELD=STRPTR-1 THEN BEGIN FLUSHSTRING(CURINPUT.NAMEFIELD
);CURINPUT.NAMEFIELD:=CURNAME;END;{777:}
BEGIN IF INPUTLN(INPUTFILE[CURINPUT.INDEXFIELD],FALSE)THEN BEGIN IF(LAST
-CURINPUT.STARTFIELD=29)AND(BUFFER[CURINPUT.STARTFIELD]=67)AND(BUFFER[
CURINPUT.STARTFIELD+8]=22)THEN BEGIN WHILE(INPUTFILE[CURINPUT.INDEXFIELD
]↑<>CHR(12))AND(NOT EOF(INPUTFILE[CURINPUT.INDEXFIELD]))DO BEGIN READLN(
INPUTFILE[CURINPUT.INDEXFIELD]);
READ(INPUTFILE[CURINPUT.INDEXFIELD],AUXBUF:TEMPPTR);END;
BUFFER[CURINPUT.STARTFIELD]:=12;LAST:=CURINPUT.STARTFIELD+1;END;END;
PAGE:=1;FIRMUPTHELIN;BUFFER[CURINPUT.LIMITFIELD]:=37;
FIRST:=CURINPUT.LIMITFIELD+1;CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;
LINE:=1;END{:777};END;{:776}{807:}PROCEDURE BADEXP(S:STRNUMBER);
VAR SAVEFLAG:0..82;BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(S);END;PRINT(634);PRINTCMDMOD(CURCMD,CURMOD);
PRINTCHAR(39);BEGIN HELPPTR:=4;HELPLINE[3]:=635;HELPLINE[2]:=636;
HELPLINE[1]:=637;HELPLINE[0]:=638;END;BACKINPUT;CURSYM:=0;CURCMD:=42;
CURMOD:=0;INSERROR;SAVEFLAG:=VARFLAG;VARFLAG:=0;GETXNEXT;
VARFLAG:=SAVEFLAG;END;{:807}{810:}PROCEDURE STASHIN(P:HALFWORD);
VAR Q:HALFWORD;BEGIN MEM[P].HH.B0:=CURTYPE;
IF CURTYPE=15 THEN MEM[P+1].INT:=CUREXP ELSE BEGIN IF CURTYPE=19 THEN{
812:}BEGIN Q:=SINGLEDEPEND(CUREXP);
IF Q=DEPFINAL THEN BEGIN MEM[P].HH.B0:=15;MEM[P+1].INT:=0;FREENODE(Q,2);
END ELSE BEGIN MEM[P].HH.B0:=16;NEWDEP(P,Q);END;RECYCLEVALUE(CUREXP);
END{:812}ELSE BEGIN MEM[P+1]:=MEM[CUREXP+1];
MEM[MEM[P+1].HH.LH].HH.RH:=P;END;FREENODE(CUREXP,2);END;CURTYPE:=1;END;
{:810}{831:}PROCEDURE BACKEXPR;VAR P:HALFWORD;BEGIN P:=STASHCUREXP;
MEM[P].HH.RH:=0;BEGINTOKENLI(P,10);END;{:831}{832:}
PROCEDURE BADSUBSCRIPT;BEGIN DISPERR(0,650);BEGIN HELPPTR:=3;
HELPLINE[2]:=651;HELPLINE[1]:=652;HELPLINE[0]:=653;END;FLUSHERROR(0);
END;{:832}{834:}PROCEDURE OBLITERATED(Q:HALFWORD);
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(654);
END;SHOWTOKENLIS(Q,0,1000);PRINT(655);BEGIN HELPPTR:=5;HELPLINE[4]:=656;
HELPLINE[3]:=657;HELPLINE[2]:=658;HELPLINE[1]:=659;HELPLINE[0]:=660;END;
END;{:834}{845:}PROCEDURE BINARYMAC(P,C,N:HALFWORD);VAR Q,R:HALFWORD;
BEGIN Q:=GETAVAIL;R:=GETAVAIL;MEM[Q].HH.RH:=R;MEM[Q].HH.LH:=P;
MEM[R].HH.LH:=STASHCUREXP;MACROCALL(C,Q,N);END;{:845}{848:}
PROCEDURE MATERIALIZEP;LABEL 50;
VAR AMINUSB,APLUSB,MAJORAXIS,MINORAXIS:SCALED;THETA:ANGLE;P:HALFWORD;
Q:HALFWORD;BEGIN Q:=CUREXP;
IF MEM[Q].HH.B0=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(670);END;BEGIN HELPPTR:=2;HELPLINE[1]:=671;
HELPLINE[0]:=437;END;PUTGETERROR;CUREXP:=3;GOTO 50;
END ELSE IF MEM[Q].HH.B0=4 THEN{849:}BEGIN TX:=MEM[Q+1].INT;
TY:=MEM[Q+2].INT;TXX:=MEM[Q+3].INT-TX;TYX:=MEM[Q+4].INT-TY;
TXY:=MEM[Q+5].INT-TX;TYY:=MEM[Q+6].INT-TY;
AMINUSB:=PYTHADD(TXX-TYY,TYX+TXY);APLUSB:=PYTHADD(TXX+TYY,TYX-TXY);
MAJORAXIS:=(AMINUSB+APLUSB)DIV 2;MINORAXIS:=(ABS(APLUSB-AMINUSB))DIV 2;
IF MAJORAXIS=MINORAXIS THEN THETA:=0 ELSE THETA:=(NARG(TXX-TYY,TYX+TXY)+
NARG(TXX+TYY,TYX-TXY))DIV 2;FREENODE(Q,7);
Q:=MAKEELLIPSE(MAJORAXIS,MINORAXIS,THETA);IF(TX<>0)OR(TY<>0)THEN{850:}
BEGIN P:=Q;REPEAT MEM[P+1].INT:=MEM[P+1].INT+TX;
MEM[P+2].INT:=MEM[P+2].INT+TY;P:=MEM[P].HH.RH;UNTIL P=Q;END{:850};
END{:849};CUREXP:=MAKEPEN(Q);50:TOSSKNOTLIST(Q);CURTYPE:=6;END;{:848}
{854:}{855:}PROCEDURE KNOWNPAIR;VAR P:HALFWORD;
BEGIN IF CURTYPE<>14 THEN BEGIN DISPERR(0,673);BEGIN HELPPTR:=3;
HELPLINE[2]:=674;HELPLINE[1]:=675;HELPLINE[0]:=676;END;PUTGETFLUSHE(0);
CURX:=0;CURY:=0;END ELSE BEGIN P:=MEM[CUREXP+1].INT;{856:}
IF MEM[P].HH.B0=15 THEN CURX:=MEM[P+1].INT ELSE BEGIN DISPERR(P,677);
BEGIN HELPPTR:=3;HELPLINE[2]:=678;HELPLINE[1]:=675;HELPLINE[0]:=676;END;
PUTGETERROR;RECYCLEVALUE(P);CURX:=0;END;
IF MEM[P+2].HH.B0=15 THEN CURY:=MEM[P+3].INT ELSE BEGIN DISPERR(P+2,679)
;BEGIN HELPPTR:=3;HELPLINE[2]:=680;HELPLINE[1]:=675;HELPLINE[0]:=676;
END;PUTGETERROR;RECYCLEVALUE(P+2);CURY:=0;END{:856};FLUSHCUREXP(0);END;
END;{:855}FUNCTION NEWKNOT:HALFWORD;VAR Q:HALFWORD;BEGIN Q:=GETNODE(7);
MEM[Q].HH.B0:=0;MEM[Q].HH.B1:=0;MEM[Q].HH.RH:=Q;KNOWNPAIR;
MEM[Q+1].INT:=CURX;MEM[Q+2].INT:=CURY;NEWKNOT:=Q;END;{:854}{858:}
FUNCTION SCANDIRECTIO:SMALLNUMBER;VAR T:2..4;X:SCALED;BEGIN GETXNEXT;
IF CURCMD=61 THEN{859:}BEGIN GETXNEXT;SCANEXPRESSI;
IF(CURTYPE<>15)OR(CUREXP<0)THEN BEGIN DISPERR(0,683);BEGIN HELPPTR:=1;
HELPLINE[0]:=684;END;PUTGETFLUSHE(65536);END;T:=3;END{:859}ELSE{860:}
BEGIN SCANEXPRESSI;IF CURTYPE>14 THEN{861:}
BEGIN IF CURTYPE<>15 THEN BEGIN DISPERR(0,677);BEGIN HELPPTR:=3;
HELPLINE[2]:=678;HELPLINE[1]:=675;HELPLINE[0]:=676;END;PUTGETFLUSHE(0);
END;X:=CUREXP;IF CURCMD<>79 THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=2;
HELPLINE[1]:=685;HELPLINE[0]:=686;END;BACKERROR;END;GETXNEXT;
SCANEXPRESSI;IF CURTYPE<>15 THEN BEGIN DISPERR(0,679);BEGIN HELPPTR:=3;
HELPLINE[2]:=680;HELPLINE[1]:=675;HELPLINE[0]:=676;END;PUTGETFLUSHE(0);
END;CURY:=CUREXP;CURX:=X;END{:861}ELSE KNOWNPAIR;
IF(CURX=0)AND(CURY=0)THEN T:=4 ELSE BEGIN T:=2;CUREXP:=NARG(CURX,CURY);
END;END{:860};IF CURCMD<>65 THEN BEGIN MISSINGERR(125);BEGIN HELPPTR:=3;
HELPLINE[2]:=681;HELPLINE[1]:=682;HELPLINE[0]:=560;END;BACKERROR;END;
GETXNEXT;SCANDIRECTIO:=T;END;{:858}{878:}
PROCEDURE DONULLARY(C:QUARTERWORD);VAR K:INTEGER;
BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;END;
IF INTERNAL[7]>131072 THEN SHOWCMDMOD(33,C);
CASE C OF 30,31:BEGIN CURTYPE:=2;CUREXP:=C;END;32:BEGIN CURTYPE:=11;
CUREXP:=GETNODE(6);INITEDGES(CUREXP);END;33:BEGIN CURTYPE:=6;CUREXP:=3;
END;37:BEGIN CURTYPE:=15;CUREXP:=NORMRAND;END;36:{879:}BEGIN CURTYPE:=8;
CUREXP:=GETNODE(7);MEM[CUREXP].HH.B0:=4;MEM[CUREXP].HH.B1:=4;
MEM[CUREXP].HH.RH:=CUREXP;MEM[CUREXP+1].INT:=0;MEM[CUREXP+2].INT:=0;
MEM[CUREXP+3].INT:=65536;MEM[CUREXP+4].INT:=0;MEM[CUREXP+5].INT:=0;
MEM[CUREXP+6].INT:=65536;END{:879};
34:BEGIN IF JOBNAME=0 THEN OPENLOGFILE;CURTYPE:=4;CUREXP:=JOBNAME;END;
35:{880:}BEGIN IF INTERACTION<=1 THEN FATALERROR(697);BEGINFILEREA;
CURINPUT.NAMEFIELD:=1;BEGIN BEGIN IF INSKP0 THEN END;PRINT(157);
TERMINPUT;END;
BEGIN IF POOLPTR+LAST-CURINPUT.STARTFIELD>MAXPOOLPTR THEN BEGIN IF
POOLPTR+LAST-CURINPUT.STARTFIELD>POOLSIZE THEN OVERFLOW(129,POOLSIZE-
INITPOOLPTR);MAXPOOLPTR:=POOLPTR+LAST-CURINPUT.STARTFIELD;END;END;
FOR K:=CURINPUT.STARTFIELD TO LAST-1 DO BEGIN STRPOOL[POOLPTR]:=BUFFER[K
];POOLPTR:=POOLPTR+1;END;ENDFILEREADI;CURTYPE:=4;CUREXP:=MAKESTRING;
END{:880};END;BEGIN IF ARITHERROR THEN CLEARARITH;END;END;{:878}{881:}
{882:}FUNCTION NICEPAIR(P:INTEGER;T:QUARTERWORD):BOOLEAN;LABEL 10;
BEGIN IF T=14 THEN BEGIN P:=MEM[P+1].INT;
IF MEM[P].HH.B0=15 THEN IF MEM[P+2].HH.B0=15 THEN BEGIN NICEPAIR:=TRUE;
GOTO 10;END;END;NICEPAIR:=FALSE;10:END;{:882}{883:}
PROCEDURE PRINTKNOWNOR(T:SMALLNUMBER;V:INTEGER);BEGIN PRINTCHAR(40);
IF T<16 THEN IF T<>14 THEN PRINTTYPE(T)ELSE IF NICEPAIR(V,14)THEN PRINT(
211)ELSE PRINT(698)ELSE PRINT(699);PRINTCHAR(41);END;{:883}{884:}
PROCEDURE BADUNARY(C:QUARTERWORD);BEGIN DISPERR(0,700);PRINTOP(C);
PRINTKNOWNOR(CURTYPE,CUREXP);BEGIN HELPPTR:=3;HELPLINE[2]:=701;
HELPLINE[1]:=702;HELPLINE[0]:=703;END;PUTGETERROR;END;{:884}{887:}
PROCEDURE NEGATEDEPLIS(P:HALFWORD);LABEL 10;
BEGIN WHILE TRUE DO BEGIN MEM[P+1].INT:=-MEM[P+1].INT;
IF MEM[P].HH.LH=0 THEN GOTO 10;P:=MEM[P].HH.RH;END;10:END;{:887}{891:}
PROCEDURE PAIRTOPATH;BEGIN CUREXP:=NEWKNOT;CURTYPE:=9;END;{:891}{893:}
PROCEDURE TAKEPART(C:QUARTERWORD);VAR P:HALFWORD;
BEGIN P:=MEM[CUREXP+1].INT;MEM[18].INT:=P;MEM[17].HH.B0:=CURTYPE;
MEM[P].HH.RH:=17;FREENODE(CUREXP,2);MAKEEXPCOPY(P+2*(C-53));
RECYCLEVALUE(17);END;{:893}{896:}PROCEDURE STRTONUM(C:QUARTERWORD);
VAR N:INTEGER;M:ASCIICODE;K:POOLPOINTER;B:8..16;BADCHAR:BOOLEAN;
BEGIN IF C=49 THEN IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])=0 THEN N:=-1
ELSE N:=STRPOOL[STRSTART[CUREXP]]ELSE BEGIN IF C=47 THEN B:=8 ELSE B:=16
;N:=0;BADCHAR:=FALSE;
FOR K:=STRSTART[CUREXP]TO STRSTART[CUREXP+1]-1 DO BEGIN M:=STRPOOL[K];
IF(M>=48)AND(M<=57)THEN M:=M-48 ELSE IF(M>=65)AND(M<=70)THEN M:=M-55
ELSE IF(M>=97)AND(M<=102)THEN M:=M-87 ELSE BEGIN BADCHAR:=TRUE;M:=0;END;
IF M>=B THEN BEGIN BADCHAR:=TRUE;M:=0;END;
IF N<32768 DIV B THEN N:=N*B+M ELSE N:=32767;END;{897:}
IF BADCHAR THEN BEGIN DISPERR(0,705);IF C=47 THEN BEGIN HELPPTR:=1;
HELPLINE[0]:=706;END ELSE BEGIN HELPPTR:=1;HELPLINE[0]:=707;END;
PUTGETERROR;END;
IF N>4095 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(708);END;PRINTINT(N);PRINTCHAR(41);BEGIN HELPPTR:=1;
HELPLINE[0]:=709;END;PUTGETERROR;END{:897};END;FLUSHCUREXP(N*65536);END;
{:896}{899:}FUNCTION PATHLENGTH:SCALED;VAR N:SCALED;P:HALFWORD;
BEGIN P:=CUREXP;IF MEM[P].HH.B0=0 THEN N:=-65536 ELSE N:=0;
REPEAT P:=MEM[P].HH.RH;N:=N+65536;UNTIL P=CUREXP;PATHLENGTH:=N;END;
{:899}{902:}PROCEDURE TESTKNOWN(C:QUARTERWORD);LABEL 30;VAR B:30..31;
P,Q:HALFWORD;BEGIN B:=31;CASE CURTYPE OF 2,4,6,8,9,11,15:B:=30;
13,14:BEGIN P:=MEM[CUREXP+1].INT;Q:=P+BIGNODESIZE[CURTYPE];
REPEAT Q:=Q-2;IF MEM[Q].HH.B0<>15 THEN GOTO 30;UNTIL Q=P;B:=30;30:END;
OTHERS:END;IF C=39 THEN FLUSHCUREXP(B)ELSE FLUSHCUREXP(61-B);CURTYPE:=2;
END;{:902}PROCEDURE DOUNARY(C:QUARTERWORD);VAR P,Q:HALFWORD;X:INTEGER;
BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;END;
IF INTERNAL[7]>131072 THEN{885:}BEGIN BEGINDIAGNOS;PRINTNL(123);
PRINTOP(C);PRINTCHAR(40);PRINTEXP(0,0);PRINT(704);ENDDIAGNOSTI(FALSE);
END{:885};
CASE C OF 69:IF CURTYPE<14 THEN IF CURTYPE<>11 THEN BADUNARY(69);
70:{886:}CASE CURTYPE OF 14,19:BEGIN Q:=CUREXP;MAKEEXPCOPY(Q);
IF CURTYPE=16 THEN NEGATEDEPLIS(MEM[CUREXP+1].HH.RH)ELSE IF CURTYPE=14
THEN BEGIN P:=MEM[CUREXP+1].INT;
IF MEM[P].HH.B0=15 THEN MEM[P+1].INT:=-MEM[P+1].INT ELSE NEGATEDEPLIS(
MEM[P+1].HH.RH);
IF MEM[P+2].HH.B0=15 THEN MEM[P+3].INT:=-MEM[P+3].INT ELSE NEGATEDEPLIS(
MEM[P+3].HH.RH);END;RECYCLEVALUE(Q);FREENODE(Q,2);END;
16,17:NEGATEDEPLIS(MEM[CUREXP+1].HH.RH);15:CUREXP:=-CUREXP;
11:NEGATEEDGES(CUREXP);OTHERS:BADUNARY(70)END{:886};{888:}
41:IF CURTYPE<>2 THEN BADUNARY(41)ELSE CUREXP:=61-CUREXP;{:888}{889:}
59,60,61,62,63,64,65,38,66:IF CURTYPE<>15 THEN BADUNARY(C)ELSE CASE C OF
59:CUREXP:=SQUARERT(CUREXP);60:CUREXP:=MEXP(CUREXP);
61:CUREXP:=MLOG(CUREXP);62,63:BEGIN NSINCOS((CUREXP MOD 23592960)*16);
IF C=62 THEN CUREXP:=ROUNDFRACTIO(NSIN)ELSE CUREXP:=ROUNDFRACTIO(NCOS);
END;64:CUREXP:=FLOORSCALED(CUREXP);65:CUREXP:=UNIFRAND(CUREXP);
38:BEGIN IF ODD(ROUNDUNSCALE(CUREXP))THEN CUREXP:=30 ELSE CUREXP:=31;
CURTYPE:=2;END;66:{1161:}BEGIN CUREXP:=ROUNDUNSCALE(CUREXP)MOD 256;
IF CUREXP<0 THEN CUREXP:=CUREXP+256;
IF CHAREXISTS[CUREXP]THEN CUREXP:=30 ELSE CUREXP:=31;CURTYPE:=2;
END{:1161};END;{:889}{890:}
67:IF NICEPAIR(CUREXP,CURTYPE)THEN BEGIN P:=MEM[CUREXP+1].INT;
X:=NARG(MEM[P+1].INT,MEM[P+3].INT);
IF X>=0 THEN FLUSHCUREXP((X+8)DIV 16)ELSE FLUSHCUREXP(-((-X+8)DIV 16));
END ELSE BADUNARY(67);{:890}{892:}
53,54:IF(CURTYPE<=14)AND(CURTYPE>=13)THEN TAKEPART(C)ELSE BADUNARY(C);
55,56,57,58:IF CURTYPE=13 THEN TAKEPART(C)ELSE BADUNARY(C);{:892}{895:}
50:IF CURTYPE<>15 THEN BADUNARY(50)ELSE BEGIN CUREXP:=ROUNDUNSCALE(
CUREXP)MOD 128;CURTYPE:=4;IF CUREXP<0 THEN CUREXP:=CUREXP+128;
IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])<>1 THEN BEGIN BEGIN IF POOLPTR+1
>MAXPOOLPTR THEN BEGIN IF POOLPTR+1>POOLSIZE THEN OVERFLOW(129,POOLSIZE-
INITPOOLPTR);MAXPOOLPTR:=POOLPTR+1;END;END;
BEGIN STRPOOL[POOLPTR]:=CUREXP;POOLPTR:=POOLPTR+1;END;
CUREXP:=MAKESTRING;END;END;
42:IF CURTYPE<>15 THEN BADUNARY(42)ELSE BEGIN OLDSETTING:=SELECTOR;
SELECTOR:=5;PRINTSCALED(CUREXP);CUREXP:=MAKESTRING;SELECTOR:=OLDSETTING;
CURTYPE:=4;END;47,48,49:IF CURTYPE<>4 THEN BADUNARY(C)ELSE STRTONUM(C);
{:895}{898:}
51:IF CURTYPE=4 THEN BEGIN BEGIN IF STRREF[CUREXP]<127 THEN IF STRREF[
CUREXP]>1 THEN STRREF[CUREXP]:=STRREF[CUREXP]-1 ELSE FLUSHSTRING(CUREXP)
;END;CURTYPE:=15;CUREXP:=(STRSTART[CUREXP+1]-STRSTART[CUREXP])*65536;
END ELSE IF CURTYPE=9 THEN FLUSHCUREXP(PATHLENGTH)ELSE IF CURTYPE=15
THEN CUREXP:=ABS(CUREXP)ELSE IF NICEPAIR(CUREXP,CURTYPE)THEN FLUSHCUREXP
(PYTHADD(MEM[MEM[CUREXP+1].INT+1].INT,MEM[MEM[CUREXP+1].INT+3].INT))ELSE
BADUNARY(C);{:898}{900:}
52:IF CURTYPE=14 THEN FLUSHCUREXP(0)ELSE IF CURTYPE<>9 THEN BADUNARY(52)
ELSE IF MEM[CUREXP].HH.B0=0 THEN FLUSHCUREXP(0)ELSE BEGIN CURPEN:=3;
CURPATHTYPE:=1;CUREXP:=MAKESPEC(CUREXP,-1879080960,0);
FLUSHCUREXP(TURNINGNUMBE*65536);END;{:900}{901:}
2:BEGIN IF(CURTYPE>=2)AND(CURTYPE<=3)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
4:BEGIN IF(CURTYPE>=4)AND(CURTYPE<=5)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
6:BEGIN IF(CURTYPE>=6)AND(CURTYPE<=8)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
9:BEGIN IF(CURTYPE>=9)AND(CURTYPE<=10)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
11:BEGIN IF(CURTYPE>=11)AND(CURTYPE<=12)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
13,14:BEGIN IF CURTYPE=C THEN FLUSHCUREXP(30)ELSE FLUSHCUREXP(31);
CURTYPE:=2;END;
18:BEGIN IF(CURTYPE>=15)AND(CURTYPE<=17)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;39,40:TESTKNOWN(C);{:901}{903:}
68:BEGIN IF CURTYPE<>9 THEN FLUSHCUREXP(31)ELSE IF MEM[CUREXP].HH.B0<>0
THEN FLUSHCUREXP(30)ELSE FLUSHCUREXP(31);CURTYPE:=2;END;{:903}{904:}
45:BEGIN IF CURTYPE=14 THEN PAIRTOPATH;
IF CURTYPE=9 THEN CURTYPE:=8 ELSE BADUNARY(45);END;
44:BEGIN IF CURTYPE=8 THEN MATERIALIZEP;
IF CURTYPE<>6 THEN BADUNARY(44)ELSE BEGIN FLUSHCUREXP(MAKEPATH(CUREXP));
CURTYPE:=9;END;END;
46:IF CURTYPE<>11 THEN BADUNARY(46)ELSE FLUSHCUREXP(TOTALWEIGHT(CUREXP))
;43:IF CURTYPE=9 THEN BEGIN P:=MEM[HTAPYPOC(CUREXP)].HH.RH;
TOSSKNOTLIST(CUREXP);CUREXP:=P;
END ELSE IF CURTYPE=14 THEN PAIRTOPATH ELSE BADUNARY(43);{:904}END;
BEGIN IF ARITHERROR THEN CLEARARITH;END;END;{:881}{905:}{906:}
PROCEDURE BADBINARY(P:HALFWORD;C:QUARTERWORD);BEGIN DISPERR(P,157);
DISPERR(0,700);IF C>=94 THEN PRINTOP(C);PRINTKNOWNOR(MEM[P].HH.B0,P);
IF C>=94 THEN PRINT(349)ELSE PRINTOP(C);PRINTKNOWNOR(CURTYPE,CUREXP);
BEGIN HELPPTR:=3;HELPLINE[2]:=701;HELPLINE[1]:=710;HELPLINE[0]:=711;END;
PUTGETERROR;END;{:906}{911:}FUNCTION TARNISHED(P:HALFWORD):HALFWORD;
LABEL 10;VAR Q:HALFWORD;R:HALFWORD;BEGIN Q:=MEM[P+1].INT;
R:=Q+BIGNODESIZE[MEM[P].HH.B0];REPEAT R:=R-2;
IF MEM[R].HH.B0=19 THEN BEGIN TARNISHED:=1;GOTO 10;END;UNTIL R=Q;
TARNISHED:=0;10:END;{:911}{913:}{918:}PROCEDURE DEPFINISH(V,Q:HALFWORD;
T:SMALLNUMBER);VAR P:HALFWORD;VV:SCALED;
BEGIN IF Q=0 THEN P:=CUREXP ELSE P:=Q;MEM[P+1].HH.RH:=V;MEM[P].HH.B0:=T;
IF MEM[V].HH.LH=0 THEN BEGIN VV:=MEM[V+1].INT;
IF Q=0 THEN FLUSHCUREXP(VV)ELSE BEGIN RECYCLEVALUE(P);MEM[Q].HH.B0:=15;
MEM[Q+1].INT:=VV;END;END ELSE IF Q=0 THEN CURTYPE:=T;
IF FIXNEEDED THEN FIXDEPENDENC;END;{:918}
PROCEDURE ADDORSUBTRAC(P,Q:HALFWORD;C:QUARTERWORD);LABEL 30,10;
VAR S,T:SMALLNUMBER;R:HALFWORD;V:INTEGER;
BEGIN IF Q=0 THEN BEGIN T:=CURTYPE;
IF T<16 THEN V:=CUREXP ELSE V:=MEM[CUREXP+1].HH.RH;
END ELSE BEGIN T:=MEM[Q].HH.B0;
IF T<16 THEN V:=MEM[Q+1].INT ELSE V:=MEM[Q+1].HH.RH;END;
IF T=15 THEN BEGIN IF C=70 THEN V:=-V;
IF MEM[P].HH.B0=15 THEN BEGIN V:=SLOWADD(MEM[P+1].INT,V);
IF Q=0 THEN CUREXP:=V ELSE MEM[Q+1].INT:=V;GOTO 10;END;{914:}
R:=MEM[P+1].HH.RH;WHILE MEM[R].HH.LH<>0 DO R:=MEM[R].HH.RH;
MEM[R+1].INT:=SLOWADD(MEM[R+1].INT,V);IF Q=0 THEN BEGIN Q:=GETNODE(2);
CUREXP:=Q;CURTYPE:=MEM[P].HH.B0;MEM[Q].HH.B1:=11;END;
MEM[Q+1].HH.RH:=MEM[P+1].HH.RH;MEM[Q].HH.B0:=MEM[P].HH.B0;
MEM[Q+1].HH.LH:=MEM[P+1].HH.LH;MEM[MEM[P+1].HH.LH].HH.RH:=Q;
MEM[P].HH.B0:=15;{:914};END ELSE BEGIN IF C=70 THEN NEGATEDEPLIS(V);
{915:}IF MEM[P].HH.B0=15 THEN{916:}
BEGIN WHILE MEM[V].HH.LH<>0 DO V:=MEM[V].HH.RH;
MEM[V+1].INT:=SLOWADD(MEM[P+1].INT,MEM[V+1].INT);END{:916}
ELSE BEGIN S:=MEM[P].HH.B0;R:=MEM[P+1].HH.RH;
IF T=16 THEN BEGIN IF S=16 THEN IF MAXCOEF(R)+MAXCOEF(V)<626349397 THEN
BEGIN V:=PPLUSQ(V,R,16);GOTO 30;END;T:=17;V:=POVERV(V,65536,16,17);END;
IF S=17 THEN V:=PPLUSQ(V,R,17)ELSE V:=PPLUSFQ(V,65536,R,17,16);30:{917:}
IF Q<>0 THEN DEPFINISH(V,Q,T)ELSE BEGIN CURTYPE:=T;DEPFINISH(V,0,T);
END{:917};END{:915};END;10:END;{:913}{926:}PROCEDURE DEPMULT(P:HALFWORD;
V:INTEGER;VISSCALED:BOOLEAN);LABEL 10;VAR Q:HALFWORD;S,T:SMALLNUMBER;
BEGIN IF P=0 THEN Q:=CUREXP ELSE IF MEM[P].HH.B0<>15 THEN Q:=P ELSE
BEGIN IF VISSCALED THEN MEM[P+1].INT:=TAKESCALED(MEM[P+1].INT,V)ELSE MEM
[P+1].INT:=TAKEFRACTION(MEM[P+1].INT,V);GOTO 10;END;T:=MEM[Q].HH.B0;
Q:=MEM[Q+1].HH.RH;S:=T;
IF T=16 THEN IF VISSCALED THEN IF ABVSCD(MAXCOEF(Q),ABS(V),626349396,
65536)>=0 THEN T:=17;Q:=PTIMESV(Q,V,S,T,VISSCALED);DEPFINISH(Q,P,T);
10:END;{:926}{929:}PROCEDURE HARDTIMES(P:HALFWORD);VAR Q:HALFWORD;
R:HALFWORD;U,V:SCALED;
BEGIN IF MEM[P].HH.B0=14 THEN BEGIN Q:=STASHCUREXP;UNSTASHCUREX(P);P:=Q;
END;R:=MEM[CUREXP+1].INT;U:=MEM[R+1].INT;V:=MEM[R+3].INT;{930:}
MEM[R+2].HH.B0:=MEM[P].HH.B0;NEWDEP(R+2,COPYDEPLIST(MEM[P+1].HH.RH));
MEM[R].HH.B0:=MEM[P].HH.B0;MEM[R+1]:=MEM[P+1];
MEM[MEM[P+1].HH.LH].HH.RH:=R;FREENODE(P,2){:930};DEPMULT(R,U,TRUE);
DEPMULT(R+2,V,TRUE);END;{:929}{932:}PROCEDURE DEPDIV(P:HALFWORD;
V:SCALED);LABEL 10;VAR Q:HALFWORD;S,T:SMALLNUMBER;
BEGIN IF P=0 THEN Q:=CUREXP ELSE IF MEM[P].HH.B0<>15 THEN Q:=P ELSE
BEGIN MEM[P+1].INT:=MAKESCALED(MEM[P+1].INT,V);GOTO 10;END;
T:=MEM[Q].HH.B0;Q:=MEM[Q+1].HH.RH;S:=T;
IF T=16 THEN IF ABVSCD(MAXCOEF(Q),65536,626349396,ABS(V))>=0 THEN T:=17;
Q:=POVERV(Q,V,S,T);DEPFINISH(Q,P,T);10:END;{:932}{936:}
PROCEDURE SETUPTRANS(C:QUARTERWORD);LABEL 30,10;VAR P,Q,R:HALFWORD;
BEGIN IF(C<>88)OR(CURTYPE<>13)THEN{938:}BEGIN P:=STASHCUREXP;
CUREXP:=IDTRANSFORM;CURTYPE:=13;Q:=MEM[CUREXP+1].INT;CASE C OF{940:}
84:IF MEM[P].HH.B0=15 THEN{941:}
BEGIN NSINCOS((MEM[P+1].INT MOD 23592960)*16);
MEM[Q+5].INT:=ROUNDFRACTIO(NCOS);MEM[Q+9].INT:=ROUNDFRACTIO(NSIN);
MEM[Q+7].INT:=-MEM[Q+9].INT;MEM[Q+11].INT:=MEM[Q+5].INT;GOTO 30;
END{:941};85:IF MEM[P].HH.B0>14 THEN BEGIN INSTALL(Q+6,P);GOTO 30;END;
86:IF MEM[P].HH.B0>14 THEN BEGIN INSTALL(Q+4,P);INSTALL(Q+10,P);GOTO 30;
END;87:IF MEM[P].HH.B0=14 THEN BEGIN R:=MEM[P+1].INT;INSTALL(Q,R);
INSTALL(Q+2,R+2);GOTO 30;END;
89:IF MEM[P].HH.B0>14 THEN BEGIN INSTALL(Q+4,P);GOTO 30;END;
90:IF MEM[P].HH.B0>14 THEN BEGIN INSTALL(Q+10,P);GOTO 30;END;
91:IF MEM[P].HH.B0=14 THEN{942:}BEGIN R:=MEM[P+1].INT;INSTALL(Q+4,R);
INSTALL(Q+10,R);INSTALL(Q+8,R+2);
IF MEM[R+2].HH.B0=15 THEN MEM[R+3].INT:=-MEM[R+3].INT ELSE NEGATEDEPLIS(
MEM[R+3].HH.RH);INSTALL(Q+6,R+2);GOTO 30;END{:942};88:;{:940}END;
DISPERR(P,720);BEGIN HELPPTR:=3;HELPLINE[2]:=721;HELPLINE[1]:=722;
HELPLINE[0]:=723;END;PUTGETERROR;30:RECYCLEVALUE(P);FREENODE(P,2);
END{:938};{939:}Q:=MEM[CUREXP+1].INT;R:=Q+12;REPEAT R:=R-2;
IF MEM[R].HH.B0<>15 THEN GOTO 10;UNTIL R=Q;TXX:=MEM[Q+5].INT;
TXY:=MEM[Q+7].INT;TYX:=MEM[Q+9].INT;TYY:=MEM[Q+11].INT;TX:=MEM[Q+1].INT;
TY:=MEM[Q+3].INT;FLUSHCUREXP(0){:939};10:END;{:936}{943:}
PROCEDURE SETUPKNOWNTR(C:QUARTERWORD);BEGIN SETUPTRANS(C);
IF CURTYPE<>15 THEN BEGIN DISPERR(0,724);BEGIN HELPPTR:=3;
HELPLINE[2]:=725;HELPLINE[1]:=726;HELPLINE[0]:=723;END;PUTGETFLUSHE(0);
TXX:=65536;TXY:=0;TYX:=0;TYY:=65536;TX:=0;TY:=0;END;END;{:943}{944:}
PROCEDURE TRANS(P,Q:HALFWORD);VAR V:SCALED;
BEGIN V:=TAKESCALED(MEM[P].INT,TXX)+TAKESCALED(MEM[Q].INT,TXY)+TX;
MEM[Q].INT:=TAKESCALED(MEM[P].INT,TYX)+TAKESCALED(MEM[Q].INT,TYY)+TY;
MEM[P].INT:=V;END;{:944}{945:}PROCEDURE PATHTRANS(P:HALFWORD;
C:QUARTERWORD);LABEL 10;VAR Q:HALFWORD;BEGIN SETUPKNOWNTR(C);
UNSTASHCUREX(P);
IF CURTYPE=6 THEN BEGIN IF MEM[CUREXP+9].INT=0 THEN IF TX=0 THEN IF TY=0
THEN GOTO 10;FLUSHCUREXP(MAKEPATH(CUREXP));CURTYPE:=8;END;Q:=CUREXP;
REPEAT IF MEM[Q].HH.B0<>0 THEN TRANS(Q+3,Q+4);TRANS(Q+1,Q+2);
IF MEM[Q].HH.B1<>0 THEN TRANS(Q+5,Q+6);Q:=MEM[Q].HH.RH;UNTIL Q=CUREXP;
10:END;{:945}{946:}PROCEDURE EDGESTRANS(P:HALFWORD;C:QUARTERWORD);
LABEL 10;BEGIN SETUPKNOWNTR(C);UNSTASHCUREX(P);CUREDGES:=CUREXP;
IF MEM[CUREDGES].HH.RH=CUREDGES THEN GOTO 10;
IF ABS(TXY)=65536 THEN IF ABS(TYX)=65536 THEN IF TXX=0 THEN IF TYY=0
THEN BEGIN XYSWAPEDGES;TXX:=TXY;TYY:=TYX;TXY:=0;TYX:=0;
IF MEM[CUREDGES].HH.RH=CUREDGES THEN GOTO 10;END;
IF ABS(TXX)=65536 THEN IF ABS(TYY)=65536 THEN IF TXY=0 THEN IF TYX=0
THEN BEGIN IF TXX<0 THEN XREFLECTEDGE;IF TYY<0 THEN YREFLECTEDGE;{947:}
TX:=ROUNDUNSCALE(TX);TY:=ROUNDUNSCALE(TY);
IF(MEM[CUREDGES+2].HH.LH+TX<=0)OR(MEM[CUREDGES+2].HH.RH+TX>=8192)OR(MEM[
CUREDGES+1].HH.LH+TY<=0)OR(MEM[CUREDGES+1].HH.RH+TY>=8191)OR(ABS(TX)>=
4096)OR(ABS(TY)>=4096)THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(730);END;BEGIN HELPPTR:=3;
HELPLINE[2]:=731;HELPLINE[1]:=732;HELPLINE[0]:=723;END;PUTGETERROR;
END ELSE BEGIN IF TX<>0 THEN BEGIN IF NOT(ABS(MEM[CUREDGES+3].HH.LH-TX
-4096)<4096)THEN FIXOFFSET;
MEM[CUREDGES+2].HH.LH:=MEM[CUREDGES+2].HH.LH+TX;
MEM[CUREDGES+2].HH.RH:=MEM[CUREDGES+2].HH.RH+TX;
MEM[CUREDGES+3].HH.LH:=MEM[CUREDGES+3].HH.LH-TX;MEM[CUREDGES+4].INT:=0;
END;IF TY<>0 THEN BEGIN MEM[CUREDGES+1].HH.LH:=MEM[CUREDGES+1].HH.LH+TY;
MEM[CUREDGES+1].HH.RH:=MEM[CUREDGES+1].HH.RH+TY;
MEM[CUREDGES+5].HH.LH:=MEM[CUREDGES+5].HH.LH+TY;MEM[CUREDGES+4].INT:=0;
END;END{:947};GOTO 10;END;BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(727);END;BEGIN HELPPTR:=3;HELPLINE[2]:=728;
HELPLINE[1]:=729;HELPLINE[0]:=723;END;PUTGETERROR;10:END;{:946}{948:}
{950:}PROCEDURE BILIN1(P:HALFWORD;T:SCALED;Q:HALFWORD;U,DELTA:SCALED);
VAR R:HALFWORD;BEGIN IF T<>65536 THEN DEPMULT(P,T,TRUE);
IF U<>0 THEN IF MEM[Q].HH.B0=15 THEN DELTA:=DELTA+TAKESCALED(MEM[Q+1].
INT,U)ELSE BEGIN{951:}
IF MEM[P].HH.B0<>17 THEN BEGIN IF MEM[P].HH.B0=15 THEN NEWDEP(P,
CONSTDEPENDE(MEM[P+1].INT))ELSE MEM[P+1].HH.RH:=PTIMESV(MEM[P+1].HH.RH,
65536,16,17,TRUE);MEM[P].HH.B0:=17;END{:951};
MEM[P+1].HH.RH:=PPLUSFQ(MEM[P+1].HH.RH,U,MEM[Q+1].HH.RH,17,MEM[Q].HH.B0)
;END;
IF MEM[P].HH.B0=15 THEN MEM[P+1].INT:=MEM[P+1].INT+DELTA ELSE BEGIN R:=
MEM[P+1].HH.RH;WHILE MEM[R].HH.LH<>0 DO R:=MEM[R].HH.RH;
DELTA:=MEM[R+1].INT+DELTA;
IF R<>MEM[P+1].HH.RH THEN MEM[R+1].INT:=DELTA ELSE BEGIN RECYCLEVALUE(P)
;MEM[P].HH.B0:=15;MEM[P+1].INT:=DELTA;END;END;
IF FIXNEEDED THEN FIXDEPENDENC;END;{:950}{953:}
PROCEDURE ADDMULTDEP(P:HALFWORD;V:SCALED;R:HALFWORD);
BEGIN IF MEM[R].HH.B0=15 THEN MEM[DEPFINAL+1].INT:=MEM[DEPFINAL+1].INT+
TAKESCALED(MEM[R+1].INT,V)ELSE BEGIN MEM[P+1].HH.RH:=PPLUSFQ(MEM[P+1].HH
.RH,V,MEM[R+1].HH.RH,17,MEM[R].HH.B0);IF FIXNEEDED THEN FIXDEPENDENC;
END;END;{:953}{954:}PROCEDURE BILIN2(P,T:HALFWORD;V:SCALED;
U,Q:HALFWORD);VAR VV:SCALED;BEGIN VV:=MEM[P+1].INT;MEM[P].HH.B0:=17;
NEWDEP(P,CONSTDEPENDE(0));IF VV<>0 THEN ADDMULTDEP(P,VV,T);
IF V<>0 THEN ADDMULTDEP(P,V,U);IF Q<>0 THEN ADDMULTDEP(P,65536,Q);
IF MEM[P+1].HH.RH=DEPFINAL THEN BEGIN VV:=MEM[DEPFINAL+1].INT;
RECYCLEVALUE(P);MEM[P].HH.B0:=15;MEM[P+1].INT:=VV;END;END;{:954}{956:}
PROCEDURE BILIN3(P:HALFWORD;T,V,U,DELTA:SCALED);
BEGIN IF T<>65536 THEN DELTA:=DELTA+TAKESCALED(MEM[P+1].INT,T)ELSE DELTA
:=DELTA+MEM[P+1].INT;
IF U<>0 THEN MEM[P+1].INT:=DELTA+TAKESCALED(V,U)ELSE MEM[P+1].INT:=DELTA
;END;{:956}PROCEDURE BIGTRANS(P:HALFWORD;C:QUARTERWORD);LABEL 10;
VAR Q,R,PP,QQ:HALFWORD;S:SMALLNUMBER;BEGIN S:=BIGNODESIZE[MEM[P].HH.B0];
Q:=MEM[P+1].INT;R:=Q+S;REPEAT R:=R-2;IF MEM[R].HH.B0<>15 THEN{949:}
BEGIN SETUPKNOWNTR(C);MAKEEXPCOPY(P);R:=MEM[CUREXP+1].INT;
IF CURTYPE=13 THEN BEGIN BILIN1(R+10,TYY,Q+6,TYX,0);
BILIN1(R+8,TYY,Q+4,TYX,0);BILIN1(R+6,TXX,Q+10,TXY,0);
BILIN1(R+4,TXX,Q+8,TXY,0);END;BILIN1(R+2,TYY,Q,TYX,TY);
BILIN1(R,TXX,Q+2,TXY,TX);GOTO 10;END{:949};UNTIL R=Q;{952:}
SETUPTRANS(C);IF CURTYPE=15 THEN{955:}BEGIN MAKEEXPCOPY(P);
R:=MEM[CUREXP+1].INT;
IF CURTYPE=13 THEN BEGIN BILIN3(R+10,TYY,MEM[Q+7].INT,TYX,0);
BILIN3(R+8,TYY,MEM[Q+5].INT,TYX,0);BILIN3(R+6,TXX,MEM[Q+11].INT,TXY,0);
BILIN3(R+4,TXX,MEM[Q+9].INT,TXY,0);END;
BILIN3(R+2,TYY,MEM[Q+1].INT,TYX,TY);BILIN3(R,TXX,MEM[Q+3].INT,TXY,TX);
END{:955}ELSE BEGIN PP:=STASHCUREXP;QQ:=MEM[PP+1].INT;MAKEEXPCOPY(P);
R:=MEM[CUREXP+1].INT;
IF CURTYPE=13 THEN BEGIN BILIN2(R+10,QQ+10,MEM[Q+7].INT,QQ+8,0);
BILIN2(R+8,QQ+10,MEM[Q+5].INT,QQ+8,0);
BILIN2(R+6,QQ+4,MEM[Q+11].INT,QQ+6,0);
BILIN2(R+4,QQ+4,MEM[Q+9].INT,QQ+6,0);END;
BILIN2(R+2,QQ+10,MEM[Q+1].INT,QQ+8,QQ+2);
BILIN2(R,QQ+4,MEM[Q+3].INT,QQ+6,QQ);RECYCLEVALUE(PP);FREENODE(PP,2);END;
{:952};10:END;{:948}{958:}PROCEDURE CAT(P:HALFWORD);VAR A,B:STRNUMBER;
K:POOLPOINTER;BEGIN A:=MEM[P+1].INT;B:=CUREXP;
BEGIN IF POOLPTR+(STRSTART[A+1]-STRSTART[A])+(STRSTART[B+1]-STRSTART[B])
>MAXPOOLPTR THEN BEGIN IF POOLPTR+(STRSTART[A+1]-STRSTART[A])+(STRSTART[
B+1]-STRSTART[B])>POOLSIZE THEN OVERFLOW(129,POOLSIZE-INITPOOLPTR);
MAXPOOLPTR:=POOLPTR+(STRSTART[A+1]-STRSTART[A])+(STRSTART[B+1]-STRSTART[
B]);END;END;
FOR K:=STRSTART[A]TO STRSTART[A+1]-1 DO BEGIN STRPOOL[POOLPTR]:=STRPOOL[
K];POOLPTR:=POOLPTR+1;END;
FOR K:=STRSTART[B]TO STRSTART[B+1]-1 DO BEGIN STRPOOL[POOLPTR]:=STRPOOL[
K];POOLPTR:=POOLPTR+1;END;CUREXP:=MAKESTRING;
BEGIN IF STRREF[B]<127 THEN IF STRREF[B]>1 THEN STRREF[B]:=STRREF[B]-1
ELSE FLUSHSTRING(B);END;END;{:958}{959:}
PROCEDURE CHOPSTRING(P:HALFWORD);VAR A,B:INTEGER;L:INTEGER;K:INTEGER;
S:STRNUMBER;REVERSED:BOOLEAN;BEGIN A:=ROUNDUNSCALE(MEM[P+1].INT);
B:=ROUNDUNSCALE(MEM[P+3].INT);
IF A<=B THEN REVERSED:=FALSE ELSE BEGIN REVERSED:=TRUE;K:=A;A:=B;B:=K;
END;S:=CUREXP;L:=(STRSTART[S+1]-STRSTART[S]);IF A<0 THEN A:=0;
IF B>L THEN B:=L;
BEGIN IF POOLPTR+B-A>MAXPOOLPTR THEN BEGIN IF POOLPTR+B-A>POOLSIZE THEN
OVERFLOW(129,POOLSIZE-INITPOOLPTR);MAXPOOLPTR:=POOLPTR+B-A;END;END;
IF REVERSED THEN FOR K:=STRSTART[S]+B-1 DOWNTO STRSTART[S]+A DO BEGIN
STRPOOL[POOLPTR]:=STRPOOL[K];POOLPTR:=POOLPTR+1;
END ELSE FOR K:=STRSTART[S]+A TO STRSTART[S]+B-1 DO BEGIN STRPOOL[
POOLPTR]:=STRPOOL[K];POOLPTR:=POOLPTR+1;END;CUREXP:=MAKESTRING;
BEGIN IF STRREF[S]<127 THEN IF STRREF[S]>1 THEN STRREF[S]:=STRREF[S]-1
ELSE FLUSHSTRING(S);END;END;{:959}{960:}PROCEDURE CHOPPATH(P:HALFWORD);
VAR Q:HALFWORD;PP,QQ,RR,SS:HALFWORD;A,B,K,L:SCALED;REVERSED:BOOLEAN;
BEGIN L:=PATHLENGTH;A:=MEM[P+1].INT;B:=MEM[P+3].INT;
IF A<=B THEN REVERSED:=FALSE ELSE BEGIN REVERSED:=TRUE;K:=A;A:=B;B:=K;
END;{961:}IF A<0 THEN IF MEM[CUREXP].HH.B0=0 THEN BEGIN A:=0;
IF B<0 THEN B:=0;END ELSE REPEAT A:=A+L;B:=B+L;UNTIL A>=0;
IF B>L THEN IF MEM[CUREXP].HH.B0=0 THEN BEGIN B:=L;IF A>L THEN A:=L;
END ELSE WHILE A>=L DO BEGIN A:=A-L;B:=B-L;END{:961};Q:=CUREXP;
WHILE A>=65536 DO BEGIN Q:=MEM[Q].HH.RH;A:=A-65536;B:=B-65536;END;
IF B=A THEN{963:}BEGIN IF A>0 THEN BEGIN QQ:=MEM[Q].HH.RH;
SPLITCUBIC(Q,A*4096,MEM[QQ+1].INT,MEM[QQ+2].INT);Q:=MEM[Q].HH.RH;END;
PP:=COPYKNOT(Q);QQ:=PP;END{:963}ELSE{962:}BEGIN PP:=COPYKNOT(Q);QQ:=PP;
REPEAT Q:=MEM[Q].HH.RH;RR:=QQ;QQ:=COPYKNOT(Q);MEM[RR].HH.RH:=QQ;
B:=B-65536;UNTIL B<=0;IF A>0 THEN BEGIN SS:=PP;PP:=MEM[PP].HH.RH;
SPLITCUBIC(SS,A*4096,MEM[PP+1].INT,MEM[PP+2].INT);PP:=MEM[SS].HH.RH;
FREENODE(SS,7);IF RR=SS THEN BEGIN B:=MAKESCALED(B,65536-A);RR:=PP;END;
END;
IF B<0 THEN BEGIN SPLITCUBIC(RR,(B+65536)*4096,MEM[QQ+1].INT,MEM[QQ+2].
INT);FREENODE(QQ,7);QQ:=MEM[RR].HH.RH;END;END{:962};MEM[PP].HH.B0:=0;
MEM[QQ].HH.B1:=0;MEM[QQ].HH.RH:=PP;TOSSKNOTLIST(CUREXP);
IF REVERSED THEN BEGIN CUREXP:=MEM[HTAPYPOC(PP)].HH.RH;TOSSKNOTLIST(PP);
END ELSE CUREXP:=PP;END;{:960}{964:}PROCEDURE PAIRVALUE(X,Y:SCALED);
VAR P:HALFWORD;BEGIN P:=GETNODE(2);FLUSHCUREXP(P);CURTYPE:=14;
MEM[P].HH.B0:=14;MEM[P].HH.B1:=11;INITBIGNODE(P);P:=MEM[P+1].INT;
MEM[P].HH.B0:=15;MEM[P+1].INT:=X;MEM[P+2].HH.B0:=15;MEM[P+3].INT:=Y;END;
{:964}{966:}PROCEDURE SETUPOFFSET(P:HALFWORD);
BEGIN FINDOFFSET(MEM[P+1].INT,MEM[P+3].INT,CUREXP);PAIRVALUE(CURX,CURY);
END;PROCEDURE SETUPDIRECTI(P:HALFWORD);
BEGIN FLUSHCUREXP(FINDDIRECTIO(MEM[P+1].INT,MEM[P+3].INT,CUREXP));END;
{:966}{967:}PROCEDURE FINDPOINT(V:SCALED;C:QUARTERWORD);VAR P:HALFWORD;
N:SCALED;VV:SCALED;Q:HALFWORD;BEGIN VV:=V;P:=CUREXP;
IF MEM[P].HH.B0=0 THEN N:=-65536 ELSE N:=0;REPEAT P:=MEM[P].HH.RH;
N:=N+65536;UNTIL P=CUREXP;
IF N=0 THEN V:=0 ELSE IF V<0 THEN IF MEM[P].HH.B0=0 THEN V:=0 ELSE V:=N
-1-((-V-1)MOD N)ELSE IF V>N THEN IF MEM[P].HH.B0=0 THEN V:=N ELSE V:=V
MOD N;P:=CUREXP;WHILE V>=65536 DO BEGIN P:=MEM[P].HH.RH;V:=V-65536;END;
IF V<>0 THEN{968:}BEGIN Q:=MEM[P].HH.RH;
SPLITCUBIC(P,V*4096,MEM[Q+1].INT,MEM[Q+2].INT);P:=MEM[P].HH.RH;END{:968}
;{969:}CASE C OF 97:PAIRVALUE(MEM[P+1].INT,MEM[P+2].INT);
98:IF MEM[P].HH.B0=0 THEN PAIRVALUE(MEM[P+1].INT,MEM[P+2].INT)ELSE
PAIRVALUE(MEM[P+3].INT,MEM[P+4].INT);
99:IF MEM[P].HH.B1=0 THEN PAIRVALUE(MEM[P+1].INT,MEM[P+2].INT)ELSE
PAIRVALUE(MEM[P+5].INT,MEM[P+6].INT);END{:969};END;{:967}
PROCEDURE DOBINARY(P:HALFWORD;C:QUARTERWORD);LABEL 30,10;
VAR Q,R:HALFWORD;OLDP,OLDEXP:HALFWORD;V:INTEGER;
BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;END;
IF INTERNAL[7]>131072 THEN{907:}BEGIN BEGINDIAGNOS;PRINTNL(712);
PRINTEXP(P,0);PRINTCHAR(41);PRINTOP(C);PRINTCHAR(40);PRINTEXP(0,0);
PRINT(704);ENDDIAGNOSTI(FALSE);END{:907};{909:}
CASE MEM[P].HH.B0 OF 13,14:OLDP:=TARNISHED(P);19:OLDP:=1;
OTHERS:OLDP:=0 END;IF OLDP<>0 THEN BEGIN Q:=STASHCUREXP;OLDP:=P;
MAKEEXPCOPY(OLDP);P:=STASHCUREXP;UNSTASHCUREX(Q);END;
CASE CURTYPE OF 13,14:OLDEXP:=TARNISHED(CUREXP);19:OLDEXP:=1;
OTHERS:OLDEXP:=0 END;IF OLDEXP<>0 THEN BEGIN OLDEXP:=CUREXP;
MAKEEXPCOPY(OLDEXP);END{:909};CASE C OF 69,70:{912:}
IF(CURTYPE<14)OR(MEM[P].HH.B0<14)THEN IF(CURTYPE=11)AND(MEM[P].HH.B0=11)
THEN BEGIN IF C=70 THEN NEGATEEDGES(CUREXP);CUREDGES:=CUREXP;
MERGEEDGES(MEM[P+1].INT);
END ELSE BADBINARY(P,C)ELSE IF CURTYPE=14 THEN IF MEM[P].HH.B0<>14 THEN
BADBINARY(P,C)ELSE BEGIN Q:=MEM[P+1].INT;R:=MEM[CUREXP+1].INT;
ADDORSUBTRAC(Q,R,C);ADDORSUBTRAC(Q+2,R+2,C);
END ELSE IF MEM[P].HH.B0=14 THEN BADBINARY(P,C)ELSE ADDORSUBTRAC(P,0,C){
:912};{919:}
77,78,79,80,81,82:BEGIN IF(CURTYPE>14)AND(MEM[P].HH.B0>14)THEN
ADDORSUBTRAC(P,0,70)ELSE IF CURTYPE<>MEM[P].HH.B0 THEN BEGIN BADBINARY(P
,C);GOTO 30;
END ELSE IF CURTYPE=4 THEN FLUSHCUREXP(STRVSSTR(MEM[P+1].INT,CUREXP))
ELSE IF(CURTYPE=5)OR(CURTYPE=3)THEN{921:}BEGIN Q:=MEM[CUREXP+1].INT;
WHILE(Q<>CUREXP)AND(Q<>P)DO Q:=MEM[Q+1].INT;IF Q=P THEN FLUSHCUREXP(0);
END{:921}ELSE IF CURTYPE=14 THEN{922:}BEGIN Q:=MEM[P+1].INT;
R:=MEM[CUREXP+1].INT;ADDORSUBTRAC(Q,R,70);
IF MEM[R].HH.B0=15 THEN IF MEM[R+1].INT=0 THEN BEGIN ADDORSUBTRAC(Q+2,R
+2,70);TAKEPART(54);END ELSE TAKEPART(53)ELSE TAKEPART(53);END{:922}
ELSE IF CURTYPE=2 THEN FLUSHCUREXP(CUREXP-MEM[P+1].INT)ELSE BEGIN
BADBINARY(P,C);GOTO 30;END;{920:}
IF CURTYPE<>15 THEN BEGIN IF CURTYPE<15 THEN BEGIN DISPERR(P,157);
BEGIN HELPPTR:=1;HELPLINE[0]:=713;END END ELSE BEGIN HELPPTR:=2;
HELPLINE[1]:=714;HELPLINE[0]:=715;END;DISPERR(0,716);PUTGETFLUSHE(31);
END ELSE CASE C OF 77:IF CUREXP<0 THEN CUREXP:=30 ELSE CUREXP:=31;
78:IF CUREXP<=0 THEN CUREXP:=30 ELSE CUREXP:=31;
79:IF CUREXP>0 THEN CUREXP:=30 ELSE CUREXP:=31;
80:IF CUREXP>=0 THEN CUREXP:=30 ELSE CUREXP:=31;
81:IF CUREXP=0 THEN CUREXP:=30 ELSE CUREXP:=31;
82:IF CUREXP<>0 THEN CUREXP:=30 ELSE CUREXP:=31;END;CURTYPE:=2{:920};
30:END;{:919}{923:}
76,75:IF(MEM[P].HH.B0<>2)OR(CURTYPE<>2)THEN BADBINARY(P,C)ELSE IF MEM[P
+1].INT=C-45 THEN CUREXP:=MEM[P+1].INT;{:923}{924:}
71:IF(CURTYPE<14)OR(MEM[P].HH.B0<14)THEN BADBINARY(P,71)ELSE IF(CURTYPE=
15)OR(MEM[P].HH.B0=15)THEN{925:}
BEGIN IF MEM[P].HH.B0=15 THEN BEGIN V:=MEM[P+1].INT;FREENODE(P,2);
END ELSE BEGIN V:=CUREXP;UNSTASHCUREX(P);END;
IF CURTYPE=15 THEN CUREXP:=TAKESCALED(CUREXP,V)ELSE IF CURTYPE=14 THEN
BEGIN P:=MEM[CUREXP+1].INT;DEPMULT(P,V,TRUE);DEPMULT(P+2,V,TRUE);
END ELSE DEPMULT(0,V,TRUE);GOTO 10;END{:925}
ELSE IF(NICEPAIR(P,MEM[P].HH.B0)AND(CURTYPE>14))OR(NICEPAIR(CUREXP,
CURTYPE)AND(MEM[P].HH.B0>14))THEN BEGIN HARDTIMES(P);GOTO 10;
END ELSE BADBINARY(P,71);{:924}{931:}
72:IF(CURTYPE<>15)OR(MEM[P].HH.B0<14)THEN BADBINARY(P,72)ELSE BEGIN V:=
CUREXP;UNSTASHCUREX(P);IF V=0 THEN{933:}BEGIN DISPERR(0,648);
BEGIN HELPPTR:=2;HELPLINE[1]:=718;HELPLINE[0]:=719;END;PUTGETERROR;
END{:933}
ELSE BEGIN IF CURTYPE=15 THEN CUREXP:=MAKESCALED(CUREXP,V)ELSE IF
CURTYPE=14 THEN BEGIN P:=MEM[CUREXP+1].INT;DEPDIV(P,V);DEPDIV(P+2,V);
END ELSE DEPDIV(0,V);END;GOTO 10;END;{:931}{934:}
73,74:IF(CURTYPE=15)AND(MEM[P].HH.B0=15)THEN IF C=73 THEN CUREXP:=
PYTHADD(MEM[P+1].INT,CUREXP)ELSE CUREXP:=PYTHSUB(MEM[P+1].INT,CUREXP)
ELSE BADBINARY(P,C);{:934}{935:}
84,85,86,87,88,89,90,91:IF(MEM[P].HH.B0=9)OR(MEM[P].HH.B0=8)OR(MEM[P].HH
.B0=6)THEN BEGIN PATHTRANS(P,C);GOTO 10;
END ELSE IF(MEM[P].HH.B0=14)OR(MEM[P].HH.B0=13)THEN BIGTRANS(P,C)ELSE IF
MEM[P].HH.B0=11 THEN BEGIN EDGESTRANS(P,C);GOTO 10;
END ELSE BADBINARY(P,C);{:935}{957:}
83:IF(CURTYPE=4)AND(MEM[P].HH.B0=4)THEN CAT(P)ELSE BADBINARY(P,83);
94:IF NICEPAIR(P,MEM[P].HH.B0)AND(CURTYPE=4)THEN CHOPSTRING(MEM[P+1].INT
)ELSE BADBINARY(P,94);95:BEGIN IF CURTYPE=14 THEN PAIRTOPATH;
IF NICEPAIR(P,MEM[P].HH.B0)AND(CURTYPE=9)THEN CHOPPATH(MEM[P+1].INT)ELSE
BADBINARY(P,95);END;{:957}{965:}
97,98,99:BEGIN IF CURTYPE=14 THEN PAIRTOPATH;
IF(CURTYPE=9)AND(MEM[P].HH.B0=15)THEN FINDPOINT(MEM[P+1].INT,C)ELSE
BADBINARY(P,C);END;100:BEGIN IF CURTYPE=8 THEN MATERIALIZEP;
IF(CURTYPE=6)AND NICEPAIR(P,MEM[P].HH.B0)THEN SETUPOFFSET(MEM[P+1].INT)
ELSE BADBINARY(P,100);END;96:BEGIN IF CURTYPE=14 THEN PAIRTOPATH;
IF(CURTYPE=9)AND NICEPAIR(P,MEM[P].HH.B0)THEN SETUPDIRECTI(MEM[P+1].INT)
ELSE BADBINARY(P,96);END;{:965}{970:}
92:BEGIN IF MEM[P].HH.B0=14 THEN BEGIN Q:=STASHCUREXP;UNSTASHCUREX(P);
PAIRTOPATH;P:=STASHCUREXP;UNSTASHCUREX(Q);END;
IF CURTYPE=14 THEN PAIRTOPATH;
IF(CURTYPE=9)AND(MEM[P].HH.B0=9)THEN BEGIN PATHINTERSEC(MEM[P+1].INT,
CUREXP);PAIRVALUE(CURT,CURTT);END ELSE BADBINARY(P,92);END;{:970}END;
RECYCLEVALUE(P);FREENODE(P,2);10:BEGIN IF ARITHERROR THEN CLEARARITH;
END;{908:}IF OLDP<>0 THEN BEGIN RECYCLEVALUE(OLDP);FREENODE(OLDP,2);END;
IF OLDEXP<>0 THEN BEGIN RECYCLEVALUE(OLDEXP);FREENODE(OLDEXP,2);
END{:908};END;{:905}{927:}PROCEDURE FRACMULT(N,D:SCALED);VAR P:HALFWORD;
OLDEXP:HALFWORD;V:FRACTION;BEGIN IF INTERNAL[7]>131072 THEN{928:}
BEGIN BEGINDIAGNOS;PRINTNL(712);PRINTSCALED(N);PRINTCHAR(47);
PRINTSCALED(D);PRINT(717);PRINTEXP(0,0);PRINT(704);ENDDIAGNOSTI(FALSE);
END{:928};CASE CURTYPE OF 13,14:OLDEXP:=TARNISHED(CUREXP);19:OLDEXP:=1;
OTHERS:OLDEXP:=0 END;IF OLDEXP<>0 THEN BEGIN OLDEXP:=CUREXP;
MAKEEXPCOPY(OLDEXP);END;V:=MAKEFRACTION(N,D);
IF CURTYPE=15 THEN CUREXP:=TAKEFRACTION(CUREXP,V)ELSE IF CURTYPE=14 THEN
BEGIN P:=MEM[CUREXP+1].INT;DEPMULT(P,V,FALSE);DEPMULT(P+2,V,FALSE);
END ELSE DEPMULT(0,V,FALSE);
IF OLDEXP<>0 THEN BEGIN RECYCLEVALUE(OLDEXP);FREENODE(OLDEXP,2);END END;
{:927}{971:}{1134:}PROCEDURE ARYOUT(VAR F:FILE;B:PACKEDBYTES;
O,C:INTEGER);EXTERN;PROCEDURE WRITEGF(A,B:GFINDEX);
BEGIN ARYOUT(GFFILE,GFBUF,A DIV 4,(B+1-A)DIV 4);{+1000}END;{:1134}
{1135:}PROCEDURE GFSWAP;
BEGIN IF GFLIMIT=GFBUFSIZE THEN BEGIN WRITEGF(0,HALFBUF-1);
GFLIMIT:=HALFBUF;GFOFFSET:=GFOFFSET+GFBUFSIZE;GFPTR:=0;
END ELSE BEGIN WRITEGF(HALFBUF,GFBUFSIZE-1);GFLIMIT:=GFBUFSIZE;END;END;
{:1135}{1137:}PROCEDURE GFFOUR(X:INTEGER);
BEGIN IF X>=0 THEN BEGIN GFBUF[GFPTR]:=X DIV 16777216;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END ELSE BEGIN X:=X+1073741824;
X:=X+1073741824;BEGIN GFBUF[GFPTR]:=(X DIV 16777216)+128;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;END;X:=X MOD 16777216;
BEGIN GFBUF[GFPTR]:=X DIV 65536;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;X:=X MOD 65536;
BEGIN GFBUF[GFPTR]:=X DIV 256;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=X MOD 256;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;END;{:1137}{1138:}
PROCEDURE GFTWO(X:INTEGER);BEGIN BEGIN GFBUF[GFPTR]:=X DIV 256;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=X MOD 256;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;END;PROCEDURE GFTHREE(X:INTEGER);
BEGIN BEGIN GFBUF[GFPTR]:=X DIV 65536;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=(X MOD 65536)DIV 256;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=X MOD 256;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;END;{:1138}{1139:}
PROCEDURE GFPAINT(D:INTEGER);BEGIN IF D<64 THEN BEGIN GFBUF[GFPTR]:=0+D;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;
END ELSE IF D<256 THEN BEGIN BEGIN GFBUF[GFPTR]:=64;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=D;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;END ELSE BEGIN BEGIN GFBUF[GFPTR]:=65;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;GFTWO(D);END;END;{:1139}
{1140:}PROCEDURE GFSTRING(S:STRNUMBER);VAR K:POOLPOINTER;
BEGIN FOR K:=STRSTART[S]TO STRSTART[S+1]-1 DO BEGIN GFBUF[GFPTR]:=
STRPOOL[K];GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;END;{:1140}
{1141:}PROCEDURE GFBOC(MINM,MAXM,MINN,MAXN:INTEGER);LABEL 10;
BEGIN IF MINM<GFMINM THEN GFMINM:=MINM;IF MAXN>GFMAXN THEN GFMAXN:=MAXN;
IF BOCP=-1 THEN IF BOCC>=0 THEN IF BOCC<256 THEN IF MAXM-MINM>=0 THEN IF
MAXM-MINM<256 THEN IF MAXM>=0 THEN IF MAXM<256 THEN IF MAXN-MINN>=0 THEN
IF MAXN-MINN<256 THEN IF MAXN>=0 THEN IF MAXN<256 THEN BEGIN BEGIN GFBUF
[GFPTR]:=68;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=BOCC;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;
END;BEGIN GFBUF[GFPTR]:=MAXM-MINM;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=MAXM;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=MAXN-MINN;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=MAXN;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;GOTO 10;END;
BEGIN GFBUF[GFPTR]:=67;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFFOUR(BOCC);GFFOUR(BOCP);GFFOUR(MINM);GFFOUR(MAXM);GFFOUR(MINN);
GFFOUR(MAXN);10:END;{:1141}{1143:}PROCEDURE INITGF;VAR K:EIGHTBITS;
T:INTEGER;BEGIN GFMINM:=4096;GFMAXM:=-4096;GFMINN:=4096;GFMAXN:=-4096;
FOR K:=0 TO 255 DO CHARPTR[K]:=-1;BEGIN IF JOBNAME=0 THEN OPENLOGFILE;
PACKJOBNAME(619);WHILE NOT BOPENOUT(GFFILE)DO PROMPTFILENA(620,619);
OUTPUTFILENA:=BMAKENAMESTR(GFFILE);END;BEGIN GFBUF[GFPTR]:=247;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=131;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;OLDSETTING:=SELECTOR;
SELECTOR:=5;PRINT(903);PRINTINT(ROUNDUNSCALE(INTERNAL[13]));
PRINTCHAR(46);PRINTDD(ROUNDUNSCALE(INTERNAL[14]));PRINTCHAR(46);
PRINTDD(ROUNDUNSCALE(INTERNAL[15]));PRINTCHAR(58);
T:=ROUNDUNSCALE(INTERNAL[16]);PRINTDD(T DIV 60);PRINTDD(T MOD 60);
SELECTOR:=OLDSETTING;BEGIN GFBUF[GFPTR]:=(POOLPTR-STRSTART[STRPTR]);
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
STRSTART[STRPTR+1]:=POOLPTR;GFSTRING(STRPTR);POOLPTR:=STRSTART[STRPTR];
GFPREVPTR:=GFOFFSET+GFPTR;END;{:1143}{1144:}
PROCEDURE SHIPOUT(C:EIGHTBITS);LABEL 30;VAR F:INTEGER;
PREVM,M,MM:INTEGER;PREVN,N:INTEGER;P,Q:HALFWORD;PREVW,W,WW:INTEGER;
D:INTEGER;DELTA:INTEGER;CURMINM:INTEGER;XOFF,YOFF:INTEGER;
BEGIN IF OUTPUTFILENA=0 THEN INITGF;F:=ROUNDUNSCALE(INTERNAL[18]);
XOFF:=ROUNDUNSCALE(INTERNAL[28]);YOFF:=ROUNDUNSCALE(INTERNAL[29]);
IF TERMOFFSET>MAXPRINTLINE-9 THEN PRINTLN ELSE IF(TERMOFFSET>0)OR(
FILEOFFSET>0)THEN PRINTCHAR(32);PRINTCHAR(91);PRINTINT(C);
IF F<>0 THEN BEGIN PRINTCHAR(46);PRINTINT(F);END;BREAK(TTY);
BOCC:=256*F+C;BOCP:=CHARPTR[C];CHARPTR[C]:=GFPREVPTR;{1145:}PREVN:=4096;
P:=MEM[CUREDGES].HH.LH;N:=MEM[CUREDGES+1].HH.RH-4096;
WHILE P<>CUREDGES DO BEGIN{1147:}IF MEM[P+1].HH.LH>1 THEN SORTEDGES(P);
Q:=MEM[P+1].HH.RH;W:=0;PREVM:=-268435456;WW:=0;PREVW:=0;M:=PREVM;
REPEAT IF Q=3000 THEN MM:=268435456 ELSE BEGIN D:=0+MEM[Q].HH.LH-0;
MM:=D DIV 8;WW:=WW+(D MOD 8)-4;END;
IF MM<>M THEN BEGIN IF PREVW<=0 THEN BEGIN IF W>0 THEN{1148:}
BEGIN IF PREVM=-268435456 THEN{1150:}
BEGIN IF PREVN=4096 THEN BEGIN GFBOC(MEM[CUREDGES+2].HH.LH+XOFF-4096,MEM
[CUREDGES+2].HH.RH+XOFF-4096,MEM[CUREDGES+1].HH.LH+YOFF-4096,N+YOFF);
CURMINM:=MEM[CUREDGES+2].HH.LH-4096+MEM[CUREDGES+3].HH.LH;
END ELSE IF PREVN>N+1 THEN{1152:}BEGIN DELTA:=PREVN-N-1;
IF DELTA<256 THEN IF DELTA=0 THEN BEGIN GFBUF[GFPTR]:=70;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END ELSE BEGIN BEGIN GFBUF[GFPTR]:=71;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=DELTA;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;
END;END ELSE BEGIN BEGIN GFBUF[GFPTR]:=72;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFTWO(DELTA);END;END{:1152}ELSE{1151:}
BEGIN DELTA:=M-CURMINM;IF DELTA>165 THEN BEGIN GFBUF[GFPTR]:=70;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;
END ELSE BEGIN BEGIN GFBUF[GFPTR]:=74+DELTA;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GOTO 30;END;END{:1151};
GFPAINT(M-CURMINM);30:PREVN:=N;END{:1150}ELSE GFPAINT(M-PREVM);PREVM:=M;
PREVW:=W;END{:1148};END ELSE IF W<=0 THEN{1149:}BEGIN GFPAINT(M-PREVM);
PREVM:=M;PREVW:=W;END{:1149};M:=MM;END;W:=WW;Q:=MEM[Q].HH.RH;
UNTIL MM=268435456;IF W<>0 THEN PRINTNL(905);
IF PREVM-MEM[CUREDGES+3].HH.LH+XOFF>GFMAXM THEN GFMAXM:=PREVM-MEM[
CUREDGES+3].HH.LH+XOFF{:1147};P:=MEM[P].HH.LH;N:=N-1;END;
IF PREVN=4096 THEN{1146:}BEGIN GFBOC(0,0,0,0);
IF GFMAXM<0 THEN GFMAXM:=0;IF GFMINN>0 THEN GFMINN:=0;END{:1146}
ELSE IF PREVN+YOFF<GFMINN THEN GFMINN:=PREVN+YOFF{:1145};
BEGIN GFBUF[GFPTR]:=69;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFPREVPTR:=GFOFFSET+GFPTR;TOTALCHARS:=TOTALCHARS+1;PRINTCHAR(93);
BREAK(TTY);IF INTERNAL[10]>0 THEN PRINTEDGES(904,TRUE);END;{:1144}{977:}
{988:}PROCEDURE TRYEQ(L,R:HALFWORD);LABEL 30,31;VAR P:HALFWORD;T:15..19;
Q:HALFWORD;PP:HALFWORD;TT:16..19;COPIED:BOOLEAN;BEGIN{989:}
T:=MEM[L].HH.B0;IF T=15 THEN BEGIN T:=16;P:=CONSTDEPENDE(-MEM[L+1].INT);
Q:=P;END ELSE IF T=19 THEN BEGIN T:=16;P:=SINGLEDEPEND(L);
MEM[P+1].INT:=-MEM[P+1].INT;Q:=DEPFINAL;
END ELSE BEGIN P:=MEM[L+1].HH.RH;Q:=P;
WHILE TRUE DO BEGIN MEM[Q+1].INT:=-MEM[Q+1].INT;
IF MEM[Q].HH.LH=0 THEN GOTO 30;Q:=MEM[Q].HH.RH;END;
30:MEM[MEM[L+1].HH.LH].HH.RH:=MEM[Q].HH.RH;
MEM[MEM[Q].HH.RH+1].HH.LH:=MEM[L+1].HH.LH;MEM[L].HH.B0:=15;END{:989};
{991:}
IF R=0 THEN IF CURTYPE=15 THEN BEGIN MEM[Q+1].INT:=MEM[Q+1].INT+CUREXP;
GOTO 31;END ELSE BEGIN TT:=CURTYPE;
IF TT=19 THEN PP:=SINGLEDEPEND(CUREXP)ELSE PP:=MEM[CUREXP+1].HH.RH;
END ELSE IF MEM[R].HH.B0=15 THEN BEGIN MEM[Q+1].INT:=MEM[Q+1].INT+MEM[R
+1].INT;GOTO 31;END ELSE BEGIN TT:=MEM[R].HH.B0;
IF TT=19 THEN PP:=SINGLEDEPEND(R)ELSE PP:=MEM[R+1].HH.RH;END;
IF TT<>19 THEN COPIED:=FALSE ELSE BEGIN COPIED:=TRUE;TT:=16;END;{992:}
WATCHCOEFS:=FALSE;
IF T=TT THEN P:=PPLUSQ(P,PP,T)ELSE IF T=17 THEN P:=PPLUSFQ(P,65536,PP,17
,16)ELSE BEGIN Q:=P;
WHILE MEM[Q].HH.LH<>0 DO BEGIN MEM[Q+1].INT:=ROUNDFRACTIO(MEM[Q+1].INT);
Q:=MEM[Q].HH.RH;END;T:=17;P:=PPLUSQ(P,PP,T);END;WATCHCOEFS:=TRUE;{:992};
IF COPIED THEN FLUSHNODELIS(PP);31:{:991};IF MEM[P].HH.LH=0 THEN{990:}
BEGIN IF ABS(MEM[P+1].INT)>64 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(761);END;PRINT(763);
PRINTSCALED(MEM[P+1].INT);PRINTCHAR(41);BEGIN HELPPTR:=2;
HELPLINE[1]:=762;HELPLINE[0]:=760;END;PUTGETERROR;
END ELSE IF R=0 THEN{608:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(460);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=461;HELPLINE[0]:=462;END;PUTGETERROR;
END{:608};FREENODE(P,2);END{:990}ELSE BEGIN LINEAREQ(P,T);
IF R=0 THEN IF CURTYPE<>15 THEN IF MEM[CUREXP].HH.B0=15 THEN BEGIN PP:=
CUREXP;CUREXP:=MEM[CUREXP+1].INT;CURTYPE:=15;FREENODE(PP,2);END;END;END;
{:988}{983:}PROCEDURE MAKEEQ(LHS:HALFWORD);LABEL 20,30,45;
VAR T:SMALLNUMBER;V:INTEGER;P,Q:HALFWORD;BEGIN 20:T:=MEM[LHS].HH.B0;
IF T<=14 THEN V:=MEM[LHS+1].INT;CASE T OF{985:}
2,4,6,9,11:IF CURTYPE=T+1 THEN BEGIN NONLINEAREQ(V,CUREXP,FALSE);
GOTO 30;END ELSE IF CURTYPE=T THEN{986:}
BEGIN IF CURTYPE<=4 THEN BEGIN IF CURTYPE=4 THEN BEGIN IF STRVSSTR(V,
CUREXP)<>0 THEN GOTO 45;END ELSE IF V<>CUREXP THEN GOTO 45;{608:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(460);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=461;HELPLINE[0]:=462;END;PUTGETERROR;
END{:608};GOTO 30;END;BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(758);END;BEGIN HELPPTR:=2;HELPLINE[1]:=759;
HELPLINE[0]:=760;END;PUTGETERROR;GOTO 30;
45:BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(761);END;
BEGIN HELPPTR:=2;HELPLINE[1]:=762;HELPLINE[0]:=760;END;PUTGETERROR;
GOTO 30;END{:986};
3,5,7,12,10:IF CURTYPE=T-1 THEN BEGIN NONLINEAREQ(CUREXP,LHS,TRUE);
GOTO 30;END ELSE IF CURTYPE=T THEN BEGIN RINGMERGE(LHS,CUREXP);GOTO 30;
END ELSE IF CURTYPE=14 THEN IF T=10 THEN BEGIN PAIRTOPATH;GOTO 20;END;
13,14:IF CURTYPE=T THEN{987:}BEGIN P:=V+BIGNODESIZE[T];
Q:=MEM[CUREXP+1].INT+BIGNODESIZE[T];REPEAT P:=P-2;Q:=Q-2;TRYEQ(P,Q);
UNTIL P=V;GOTO 30;END{:987};
15,16,17,19:IF CURTYPE>=15 THEN BEGIN TRYEQ(LHS,0);GOTO 30;END;1:;{:985}
END;{984:}DISPERR(LHS,157);DISPERR(0,755);
IF MEM[LHS].HH.B0<=14 THEN PRINTTYPE(MEM[LHS].HH.B0)ELSE PRINT(215);
PRINTCHAR(61);IF CURTYPE<=14 THEN PRINTTYPE(CURTYPE)ELSE PRINT(215);
PRINTCHAR(41);BEGIN HELPPTR:=2;HELPLINE[1]:=756;HELPLINE[0]:=757;END;
PUTGETERROR{:984};30:BEGIN IF ARITHERROR THEN CLEARARITH;END;
RECYCLEVALUE(LHS);FREENODE(LHS,2);END;{:983}PROCEDURE DOASSIGNMENT;
FORWARD;PROCEDURE DOEQUATION;VAR LHS:HALFWORD;P:HALFWORD;
BEGIN LHS:=STASHCUREXP;GETXNEXT;VARFLAG:=77;SCANEXPRESSI;
IF CURCMD=51 THEN DOEQUATION ELSE IF CURCMD=77 THEN DOASSIGNMENT;
IF INTERNAL[7]>131072 THEN{979:}BEGIN BEGINDIAGNOS;PRINTNL(712);
PRINTEXP(LHS,0);PRINT(750);PRINTEXP(0,0);PRINT(704);ENDDIAGNOSTI(FALSE);
END{:979};
IF CURTYPE=10 THEN IF MEM[LHS].HH.B0=14 THEN BEGIN P:=STASHCUREXP;
UNSTASHCUREX(LHS);LHS:=P;END;MAKEEQ(LHS);END;{:977}{978:}
PROCEDURE DOASSIGNMENT;VAR LHS:HALFWORD;P:HALFWORD;Q:HALFWORD;
BEGIN IF CURTYPE<>20 THEN BEGIN DISPERR(0,747);BEGIN HELPPTR:=2;
HELPLINE[1]:=748;HELPLINE[0]:=749;END;ERROR;DOEQUATION;
END ELSE BEGIN LHS:=CUREXP;CURTYPE:=1;GETXNEXT;VARFLAG:=77;SCANEXPRESSI;
IF CURCMD=51 THEN DOEQUATION ELSE IF CURCMD=77 THEN DOASSIGNMENT;
IF INTERNAL[7]>131072 THEN{980:}BEGIN BEGINDIAGNOS;PRINTNL(123);
IF MEM[LHS].HH.LH>2242 THEN PRINT(INTNAME[MEM[LHS].HH.LH-(2242)])ELSE
SHOWTOKENLIS(LHS,0,1000);PRINT(332);PRINTEXP(0,0);PRINTCHAR(125);
ENDDIAGNOSTI(FALSE);END{:980};IF MEM[LHS].HH.LH>2242 THEN{981:}
IF CURTYPE=15 THEN INTERNAL[MEM[LHS].HH.LH-(2242)]:=CUREXP ELSE BEGIN
DISPERR(0,751);PRINT(INTNAME[MEM[LHS].HH.LH-(2242)]);PRINT(752);
BEGIN HELPPTR:=2;HELPLINE[1]:=753;HELPLINE[0]:=754;END;PUTGETERROR;
END{:981}ELSE{982:}BEGIN P:=FINDVARIABLE(LHS);
IF P<>0 THEN BEGIN Q:=STASHCUREXP;CURTYPE:=UNDTYPE(P);RECYCLEVALUE(P);
MEM[P].HH.B0:=CURTYPE;MEM[P+1].INT:=0;MAKEEXPCOPY(P);P:=STASHCUREXP;
UNSTASHCUREX(Q);MAKEEQ(P);END ELSE BEGIN OBLITERATED(LHS);PUTGETERROR;
END;END{:982};FLUSHNODELIS(LHS);END;END;{:978}{997:}
PROCEDURE DOTYPEDECLAR;VAR T:SMALLNUMBER;P:HALFWORD;Q:HALFWORD;
BEGIN IF CURMOD>=13 THEN T:=CURMOD ELSE T:=CURMOD+1;
REPEAT P:=SCANDECLARED;
FLUSHVARIABL(EQTB[MEM[P].HH.LH].RH,MEM[P].HH.RH,FALSE);
Q:=FINDVARIABLE(P);MEM[Q].HH.B0:=T;MEM[Q+1].INT:=0;FLUSHLIST(P);
IF CURCMD<79 THEN{998:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(764);END;BEGIN HELPPTR:=5;HELPLINE[4]:=765;
HELPLINE[3]:=766;HELPLINE[2]:=767;HELPLINE[1]:=768;HELPLINE[0]:=769;END;
IF CURCMD=42 THEN HELPLINE[2]:=770;PUTGETERROR;SCANNERSTATU:=2;
REPEAT GETNEXT;{727:}
IF CURCMD=39 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:727}
;UNTIL CURCMD>=79;SCANNERSTATU:=0;END{:998};UNTIL CURCMD>79;END;{:997}
{1003:}PROCEDURE DORANDOMSEED;BEGIN GETXNEXT;
IF CURCMD<>77 THEN BEGIN MISSINGERR(332);BEGIN HELPPTR:=1;
HELPLINE[0]:=775;END;BACKERROR;END;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>15 THEN BEGIN DISPERR(0,776);BEGIN HELPPTR:=2;
HELPLINE[1]:=777;HELPLINE[0]:=778;END;PUTGETFLUSHE(0);
END ELSE INITRANDOMS(CUREXP);END;{:1003}{1010:}PROCEDURE DOPROTECTION;
VAR M:0..1;T:HALFWORD;BEGIN M:=CURMOD;REPEAT GETSYMBOL;
T:=EQTB[CURSYM].LH;
IF M=0 THEN BEGIN IF T>=83 THEN EQTB[CURSYM].LH:=T-83;
END ELSE IF T<83 THEN EQTB[CURSYM].LH:=T+83;GETXNEXT;UNTIL CURCMD<>79;
END;{:1010}{1012:}PROCEDURE DEFDELIMS;VAR LDELIM,RDELIM:HALFWORD;
BEGIN GETCLEARSYMB;LDELIM:=CURSYM;GETCLEARSYMB;RDELIM:=CURSYM;
EQTB[LDELIM].LH:=31;EQTB[LDELIM].RH:=RDELIM;EQTB[RDELIM].LH:=63;
EQTB[RDELIM].RH:=LDELIM;GETXNEXT;END;{:1012}{1015:}
PROCEDURE DOSTATEMENT;FORWARD;PROCEDURE DOINTERIM;BEGIN GETXNEXT;
IF CURCMD<>40 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(784);END;PRINTCMDMOD(CURCMD,CURMOD);PRINT(789);
BEGIN HELPPTR:=1;HELPLINE[0]:=790;END;BACKERROR;
END ELSE BEGIN SAVEINTERNAL(CURMOD);BACKINPUT;END;DOSTATEMENT;END;
{:1015}{1016:}PROCEDURE DOLET;VAR L:HALFWORD;BEGIN GETSYMBOL;L:=CURSYM;
GETXNEXT;IF CURCMD<>51 THEN IF CURCMD<>77 THEN BEGIN MISSINGERR(61);
BEGIN HELPPTR:=3;HELPLINE[2]:=791;HELPLINE[1]:=535;HELPLINE[0]:=792;END;
BACKERROR;END;GETSYMBOL;
CASE CURCMD OF 10,54,44,49:MEM[CURMOD].HH.LH:=MEM[CURMOD].HH.LH+1;
OTHERS:END;CLEARSYMBOL(L,FALSE);EQTB[L].LH:=CURCMD;
IF CURCMD=41 THEN EQTB[L].RH:=0 ELSE EQTB[L].RH:=CURMOD;GETXNEXT;END;
{:1016}{1017:}PROCEDURE DONEWINTERNA;
BEGIN REPEAT IF INTPTR=MAXINTERNAL THEN OVERFLOW(793,MAXINTERNAL);
GETCLEARSYMB;INTPTR:=INTPTR+1;EQTB[CURSYM].LH:=40;
EQTB[CURSYM].RH:=INTPTR;INTNAME[INTPTR]:=HASH[CURSYM].RH;
INTERNAL[INTPTR]:=0;GETXNEXT;UNTIL CURCMD<>79;END;{:1017}{1021:}
PROCEDURE DOSHOW;BEGIN REPEAT GETXNEXT;SCANEXPRESSI;PRINTNL(629);
PRINTEXP(0,2);FLUSHCUREXP(0);UNTIL CURCMD<>79;END;{:1021}{1022:}
PROCEDURE DISPTOKEN;BEGIN PRINTNL(799);IF CURSYM=0 THEN{1023:}
BEGIN IF CURCMD=42 THEN PRINTSCALED(CURMOD)ELSE IF CURCMD=38 THEN BEGIN
GPOINTER:=CURMOD;PRINTCAPSULE;END ELSE BEGIN PRINTCHAR(34);
PRINT(CURMOD);PRINTCHAR(34);
BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1 THEN STRREF[CURMOD]
:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END;END;END{:1023}
ELSE BEGIN PRINT(HASH[CURSYM].RH);PRINTCHAR(61);
IF EQTB[CURSYM].LH>=83 THEN PRINT(800);PRINTCMDMOD(CURCMD,CURMOD);
IF CURCMD=10 THEN BEGIN PRINTLN;SHOWMACRO(CURMOD,0,100000);END;END;END;
{:1022}{1025:}PROCEDURE DOSHOWTOKEN;BEGIN REPEAT GETNEXT;DISPTOKEN;
GETXNEXT;UNTIL CURCMD<>79;END;{:1025}{1026:}PROCEDURE DOSHOWSTATS;
BEGIN PRINTNL(809);PRINTINT(VARUSED);PRINTCHAR(38);PRINTINT(DYNUSED);
IF FALSE THEN PRINT(232);PRINT(442);PRINTINT(HIMEMMIN-LOMEMMAX-1);
PRINT(810);PRINTLN;PRINTNL(811);PRINTINT(STRPTR-INITSTRPTR);
PRINTCHAR(38);PRINTINT(POOLPTR-INITPOOLPTR);PRINT(442);
PRINTINT(MAXSTRINGS-MAXSTRPTR);PRINTCHAR(38);
PRINTINT(POOLSIZE-MAXPOOLPTR);PRINT(810);PRINTLN;GETXNEXT;END;{:1026}
{1027:}PROCEDURE DISPVAR(P:HALFWORD);VAR Q:HALFWORD;N:0..MAXPRINTLINE;
BEGIN IF MEM[P].HH.B0=21 THEN{1028:}BEGIN Q:=MEM[P+1].HH.LH;
REPEAT DISPVAR(Q);Q:=MEM[Q].HH.RH;UNTIL Q=17;Q:=MEM[P+1].HH.RH;
WHILE MEM[Q].HH.B1=3 DO BEGIN DISPVAR(Q);Q:=MEM[Q].HH.RH;END;END{:1028}
ELSE IF MEM[P].HH.B0>=22 THEN{1029:}BEGIN PRINTNL(157);PRINTVARIABL(P);
IF MEM[P].HH.B0>22 THEN PRINT(527);PRINT(812);
IF FILEOFFSET>=MAXPRINTLINE-20 THEN N:=5 ELSE N:=MAXPRINTLINE-FILEOFFSET
-15;SHOWMACRO(MEM[P+1].INT,0,N);END{:1029}
ELSE IF MEM[P].HH.B0<>0 THEN BEGIN PRINTNL(157);PRINTVARIABL(P);
PRINTCHAR(61);PRINTEXP(P,0);END;END;{:1027}{1030:}PROCEDURE DOSHOWVAR;
LABEL 30;BEGIN REPEAT GETNEXT;
IF CURSYM>0 THEN IF CURSYM<=2242 THEN IF CURCMD=41 THEN IF CURMOD<>0
THEN BEGIN DISPVAR(CURMOD);GOTO 30;END;DISPTOKEN;30:GETXNEXT;
UNTIL CURCMD<>79;END;{:1030}{1031:}PROCEDURE DOSHOWDEPEND;
VAR P:HALFWORD;BEGIN P:=MEM[13].HH.RH;
WHILE P<>13 DO BEGIN IF INTERESTING(P)THEN BEGIN PRINTNL(157);
PRINTVARIABL(P);IF MEM[P].HH.B0=16 THEN PRINTCHAR(61)ELSE PRINT(632);
PRINTDEPENDE(MEM[P+1].HH.RH,MEM[P].HH.B0);END;P:=MEM[P+1].HH.RH;
WHILE MEM[P].HH.LH<>0 DO P:=MEM[P].HH.RH;P:=MEM[P].HH.RH;END;GETXNEXT;
END;{:1031}{1032:}PROCEDURE DOSHOWWHATEV;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;CASE CURMOD OF 0:DOSHOWTOKEN;
1:DOSHOWSTATS;2:DOSHOW;3:DOSHOWVAR;4:DOSHOWDEPEND;END;
IF INTERNAL[31]>0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(813);END;IF INTERACTION<3 THEN BEGIN HELPPTR:=0;
ERRORCOUNT:=ERRORCOUNT-1;END ELSE BEGIN HELPPTR:=1;HELPLINE[0]:=814;END;
IF CURCMD=80 THEN ERROR ELSE PUTGETERROR;END;END;{:1032}{1035:}
FUNCTION SCANWITH:BOOLEAN;VAR T:SMALLNUMBER;RESULT:BOOLEAN;
BEGIN T:=CURMOD;CURTYPE:=1;GETXNEXT;SCANEXPRESSI;RESULT:=FALSE;
IF CURTYPE<>T THEN{1036:}BEGIN DISPERR(0,822);BEGIN HELPPTR:=2;
HELPLINE[1]:=823;HELPLINE[0]:=824;END;IF T=6 THEN HELPLINE[1]:=825;
PUTGETFLUSHE(0);END{:1036}
ELSE IF CURTYPE=6 THEN RESULT:=TRUE ELSE{1037:}
BEGIN CUREXP:=ROUNDUNSCALE(CUREXP);
IF(ABS(CUREXP)<4)AND(CUREXP<>0)THEN RESULT:=TRUE ELSE BEGIN BEGIN IF
INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(826);END;
BEGIN HELPPTR:=1;HELPLINE[0]:=824;END;PUTGETFLUSHE(0);END;END{:1037};
SCANWITH:=RESULT;END;{:1035}{1038:}PROCEDURE FINDEDGESVAR(T:HALFWORD);
VAR P:HALFWORD;BEGIN P:=FINDVARIABLE(T);CUREDGES:=0;
IF P=0 THEN BEGIN OBLITERATED(T);PUTGETERROR;
END ELSE IF MEM[P].HH.B0<>11 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(654);END;SHOWTOKENLIS(T,0,1000);
PRINT(827);PRINTTYPE(MEM[P].HH.B0);PRINTCHAR(41);BEGIN HELPPTR:=2;
HELPLINE[1]:=828;HELPLINE[0]:=829;END;PUTGETERROR;
END ELSE CUREDGES:=MEM[P+1].INT;FLUSHNODELIS(T);END;{:1038}{1040:}
PROCEDURE DOADDTO;LABEL 30,45;VAR LHS,RHS:HALFWORD;T:SMALLNUMBER;
W:INTEGER;P:HALFWORD;Q:HALFWORD;BEGIN GETXNEXT;VARFLAG:=68;SCANPRIMARY;
IF CURTYPE<>20 THEN{1041:}BEGIN DISPERR(0,830);BEGIN HELPPTR:=4;
HELPLINE[3]:=831;HELPLINE[2]:=832;HELPLINE[1]:=833;HELPLINE[0]:=829;END;
PUTGETFLUSHE(0);END{:1041}ELSE BEGIN LHS:=CUREXP;CURPATHTYPE:=CURMOD;
CURTYPE:=1;GETXNEXT;SCANEXPRESSI;IF CURPATHTYPE=2 THEN{1042:}
BEGIN FINDEDGESVAR(LHS);
IF CUREDGES=0 THEN FLUSHCUREXP(0)ELSE IF CURTYPE<>11 THEN BEGIN DISPERR(
0,834);BEGIN HELPPTR:=2;HELPLINE[1]:=835;HELPLINE[0]:=829;END;
PUTGETFLUSHE(0);END ELSE BEGIN MERGEEDGES(CUREXP);FLUSHCUREXP(0);END;
END{:1042}ELSE{1043:}BEGIN IF CURTYPE=14 THEN PAIRTOPATH;
IF CURTYPE<>9 THEN BEGIN DISPERR(0,834);BEGIN HELPPTR:=2;
HELPLINE[1]:=836;HELPLINE[0]:=829;END;PUTGETFLUSHE(0);FLUSHTOKENLI(LHS);
END ELSE BEGIN RHS:=CUREXP;W:=1;CURPEN:=3;
WHILE CURCMD=66 DO IF SCANWITH THEN IF CURTYPE=15 THEN W:=CUREXP ELSE{
1044:}
BEGIN IF MEM[CURPEN].HH.LH=0 THEN TOSSPEN(CURPEN)ELSE MEM[CURPEN].HH.LH
:=MEM[CURPEN].HH.LH-1;CURPEN:=CUREXP;END{:1044};{1045:}
FINDEDGESVAR(LHS);IF CUREDGES=0 THEN TOSSKNOTLIST(RHS)ELSE BEGIN LHS:=0;
IF MEM[RHS].HH.B0=0 THEN IF CURPATHTYPE=0 THEN{1046:}
IF MEM[RHS].HH.RH=RHS THEN{1047:}BEGIN MEM[RHS+5].INT:=MEM[RHS+1].INT;
MEM[RHS+6].INT:=MEM[RHS+2].INT;MEM[RHS+3].INT:=MEM[RHS+1].INT;
MEM[RHS+4].INT:=MEM[RHS+2].INT;MEM[RHS].HH.B0:=1;MEM[RHS].HH.B1:=1;
END{:1047}ELSE BEGIN P:=HTAPYPOC(RHS);Q:=MEM[P].HH.RH;
MEM[PATHTAIL+5].INT:=MEM[Q+5].INT;MEM[PATHTAIL+6].INT:=MEM[Q+6].INT;
MEM[PATHTAIL].HH.B1:=MEM[Q].HH.B1;MEM[PATHTAIL].HH.RH:=MEM[Q].HH.RH;
FREENODE(Q,7);MEM[P+5].INT:=MEM[RHS+5].INT;MEM[P+6].INT:=MEM[RHS+6].INT;
MEM[P].HH.B1:=MEM[RHS].HH.B1;MEM[P].HH.RH:=MEM[RHS].HH.RH;
FREENODE(RHS,7);RHS:=P;END{:1046}ELSE{1048:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(837);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=838;HELPLINE[0]:=829;END;PUTGETERROR;
TOSSKNOTLIST(RHS);GOTO 45;END{:1048}
ELSE IF CURPATHTYPE=0 THEN LHS:=HTAPYPOC(RHS);CURWT:=W;
RHS:=MAKESPEC(RHS,MEM[CURPEN+9].INT,INTERNAL[5]);{1049:}
IF TURNINGNUMBE<=0 THEN IF CURPATHTYPE<>0 THEN IF INTERNAL[37]>0 THEN IF
(TURNINGNUMBE<0)AND(MEM[CURPEN].HH.RH=0)THEN CURWT:=-CURWT ELSE BEGIN IF
TURNINGNUMBE=0 THEN IF(INTERNAL[37]<=65536)AND(MEM[CURPEN].HH.RH=0)THEN
GOTO 30 ELSE BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(839);END ELSE BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(840);END;BEGIN HELPPTR:=2;HELPLINE[1]:=841;
HELPLINE[0]:=842;END;PUTGETERROR;END;30:{:1049};
IF MEM[CURPEN+9].INT=0 THEN FILLSPEC(RHS)ELSE FILLENVELOPE(RHS);
IF LHS<>0 THEN BEGIN LHS:=MAKESPEC(LHS,MEM[CURPEN+9].INT,INTERNAL[5]);
IF MEM[CURPEN+9].INT=0 THEN FILLSPEC(LHS)ELSE FILLENVELOPE(LHS);END;
45:END{:1045};
IF MEM[CURPEN].HH.LH=0 THEN TOSSPEN(CURPEN)ELSE MEM[CURPEN].HH.LH:=MEM[
CURPEN].HH.LH-1;END;END{:1043};END;END;{:1040}{1051:}{1079:}
FUNCTION TFMCHECK(M:SMALLNUMBER):SCALED;
BEGIN IF ABS(INTERNAL[M])>=134217728 THEN BEGIN BEGIN IF INTERACTION=3
THEN WAKEUPTERMIN;PRINTNL(133);PRINT(859);END;PRINT(INTNAME[M]);
PRINT(860);BEGIN HELPPTR:=1;HELPLINE[0]:=861;END;PUTGETERROR;
IF INTERNAL[M]>0 THEN TFMCHECK:=134217727 ELSE TFMCHECK:=-134217727;
END ELSE TFMCHECK:=INTERNAL[M];END;{:1079}PROCEDURE DOSHIPOUT;LABEL 10;
VAR C:INTEGER;BEGIN GETXNEXT;VARFLAG:=80;SCANEXPRESSI;
IF CURTYPE<>20 THEN IF CURTYPE=11 THEN CUREDGES:=CUREXP ELSE BEGIN{1041:
}BEGIN DISPERR(0,830);BEGIN HELPPTR:=4;HELPLINE[3]:=831;
HELPLINE[2]:=832;HELPLINE[1]:=833;HELPLINE[0]:=829;END;PUTGETFLUSHE(0);
END{:1041};GOTO 10;END ELSE BEGIN FINDEDGESVAR(CUREXP);CURTYPE:=1;END;
IF CUREDGES<>0 THEN BEGIN C:=ROUNDUNSCALE(INTERNAL[17])MOD 256;
IF C<0 THEN C:=C+256;{1080:}IF C<BC THEN BC:=C;IF C>EC THEN EC:=C;
CHAREXISTS[C]:=TRUE;GFDX[C]:=INTERNAL[23];GFDY[C]:=INTERNAL[24];
TFMWIDTH[C]:=TFMCHECK(19);TFMHEIGHT[C]:=TFMCHECK(20);
TFMDEPTH[C]:=TFMCHECK(21);TFMITALCORR[C]:=TFMCHECK(22){:1080};
IF INTERNAL[33]>=0 THEN SHIPOUT(C);END;FLUSHCUREXP(0);10:END;{:1051}
{1052:}PROCEDURE DODISPLAY;LABEL 45,50,10;VAR E:HALFWORD;BEGIN GETXNEXT;
VARFLAG:=73;SCANPRIMARY;IF CURTYPE<>20 THEN{1041:}BEGIN DISPERR(0,830);
BEGIN HELPPTR:=4;HELPLINE[3]:=831;HELPLINE[2]:=832;HELPLINE[1]:=833;
HELPLINE[0]:=829;END;PUTGETFLUSHE(0);END{:1041}ELSE BEGIN E:=CUREXP;
CURTYPE:=1;GETXNEXT;SCANEXPRESSI;IF CURTYPE<>15 THEN GOTO 50;
CUREXP:=ROUNDUNSCALE(CUREXP);IF CUREXP<0 THEN GOTO 45;
IF CUREXP>15 THEN GOTO 45;IF NOT WINDOWOPEN[CUREXP]THEN GOTO 45;
FINDEDGESVAR(E);IF CUREDGES<>0 THEN DISPEDGES(CUREXP);GOTO 10;
45:CUREXP:=CUREXP*65536;50:DISPERR(0,843);BEGIN HELPPTR:=1;
HELPLINE[0]:=844;END;PUTGETFLUSHE(0);FLUSHTOKENLI(E);END;10:END;{:1052}
{1053:}FUNCTION GETPAIR(C:COMMANDCODE):BOOLEAN;VAR P:HALFWORD;B:BOOLEAN;
BEGIN IF CURCMD<>C THEN GETPAIR:=FALSE ELSE BEGIN GETXNEXT;SCANEXPRESSI;
IF NICEPAIR(CUREXP,CURTYPE)THEN BEGIN P:=MEM[CUREXP+1].INT;
CURX:=MEM[P+1].INT;CURY:=MEM[P+3].INT;B:=TRUE;END ELSE B:=FALSE;
FLUSHCUREXP(0);GETPAIR:=B;END;END;{:1053}{1054:}PROCEDURE DOOPENWINDOW;
LABEL 45,10;VAR K:INTEGER;R0,C0,R1,C1:SCALED;BEGIN GETXNEXT;
SCANEXPRESSI;IF CURTYPE<>15 THEN GOTO 45;K:=ROUNDUNSCALE(CUREXP);
IF K<0 THEN GOTO 45;IF K>15 THEN GOTO 45;IF NOT GETPAIR(70)THEN GOTO 45;
R0:=CURX;C0:=CURY;IF NOT GETPAIR(71)THEN GOTO 45;R1:=CURX;C1:=CURY;
IF NOT GETPAIR(72)THEN GOTO 45;OPENAWINDOW(K,R0,C0,R1,C1,CURX,CURY);
GOTO 10;45:BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(845);END;BEGIN HELPPTR:=2;HELPLINE[1]:=846;HELPLINE[0]:=847;END;
PUTGETERROR;10:END;{:1054}{1055:}PROCEDURE DOCULL;LABEL 45,10;
VAR E:HALFWORD;KEEPING:0..1;W,WIN,WOUT:INTEGER;BEGIN W:=1;GETXNEXT;
VARFLAG:=67;SCANPRIMARY;IF CURTYPE<>20 THEN{1041:}BEGIN DISPERR(0,830);
BEGIN HELPPTR:=4;HELPLINE[3]:=831;HELPLINE[2]:=832;HELPLINE[1]:=833;
HELPLINE[0]:=829;END;PUTGETFLUSHE(0);END{:1041}ELSE BEGIN E:=CUREXP;
CURTYPE:=1;KEEPING:=CURMOD;IF NOT GETPAIR(67)THEN GOTO 45;
WHILE(CURCMD=66)AND(CURMOD=15)DO IF SCANWITH THEN W:=CUREXP;{1056:}
IF CURX>CURY THEN GOTO 45;
IF KEEPING=0 THEN BEGIN IF(CURX>0)OR(CURY<0)THEN GOTO 45;WOUT:=W;WIN:=0;
END ELSE BEGIN IF(CURX<=0)AND(CURY>=0)THEN GOTO 45;WOUT:=0;WIN:=W;
END{:1056};FINDEDGESVAR(E);
IF CUREDGES<>0 THEN CULLEDGES(FLOORUNSCALE(CURX+65535),FLOORUNSCALE(CURY
),WOUT,WIN);GOTO 10;45:BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(848);END;BEGIN HELPPTR:=1;HELPLINE[0]:=849;END;
PUTGETERROR;FLUSHTOKENLI(E);END;10:END;{:1055}{1063:}
PROCEDURE DOMESSAGE;VAR M:0..2;BEGIN M:=CURMOD;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>4 THEN BEGIN DISPERR(0,562);BEGIN HELPPTR:=1;
HELPLINE[0]:=853;END;PUTGETERROR;
END ELSE CASE M OF 0:BEGIN PRINTNL(157);SLOWPRINT(CUREXP);END;1:{1067:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(157);
END;SLOWPRINT(CUREXP);
IF ERRHELP<>0 THEN USEERRHELP:=TRUE ELSE IF LONGHELPSEEN THEN BEGIN
HELPPTR:=1;HELPLINE[0]:=854;
END ELSE BEGIN IF INTERACTION<3 THEN LONGHELPSEEN:=TRUE;
BEGIN HELPPTR:=4;HELPLINE[3]:=855;HELPLINE[2]:=856;HELPLINE[1]:=857;
HELPLINE[0]:=858;END;END;PUTGETERROR;USEERRHELP:=FALSE;END{:1067};
2:{1064:}
BEGIN IF ERRHELP<>0 THEN BEGIN IF STRREF[ERRHELP]<127 THEN IF STRREF[
ERRHELP]>1 THEN STRREF[ERRHELP]:=STRREF[ERRHELP]-1 ELSE FLUSHSTRING(
ERRHELP);END;
IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])=0 THEN ERRHELP:=0 ELSE BEGIN
ERRHELP:=CUREXP;
BEGIN IF STRREF[ERRHELP]<127 THEN STRREF[ERRHELP]:=STRREF[ERRHELP]+1;
END;END;END{:1064};END;FLUSHCUREXP(0);END;{:1063}{1084:}
FUNCTION GETCODE:EIGHTBITS;LABEL 40;VAR C:INTEGER;BEGIN GETXNEXT;
SCANEXPRESSI;IF CURTYPE=15 THEN BEGIN C:=ROUNDUNSCALE(CUREXP);
IF C>=0 THEN IF C<256 THEN GOTO 40;
END ELSE IF CURTYPE=4 THEN IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])=1
THEN BEGIN C:=STRPOOL[STRSTART[CUREXP]];GOTO 40;END;DISPERR(0,867);
BEGIN HELPPTR:=2;HELPLINE[1]:=868;HELPLINE[0]:=869;END;PUTGETFLUSHE(0);
C:=0;40:GETCODE:=C;END;{:1084}{1085:}PROCEDURE SETTAG(C:EIGHTBITS;
T:SMALLNUMBER;R:EIGHTBITS);
BEGIN IF CHARTAG[C]=0 THEN BEGIN CHARTAG[C]:=T;CHARREMAINDE[C]:=R;
END ELSE{1086:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(870);END;
IF(C>32)AND(C<128)THEN PRINT(C)ELSE BEGIN PRINT(871);PRINTINT(C);END;
PRINT(872);CASE CHARTAG[C]OF 1:PRINT(873);2:PRINT(874);3:PRINT(864);END;
BEGIN HELPPTR:=4;HELPLINE[3]:=875;HELPLINE[2]:=876;HELPLINE[1]:=877;
HELPLINE[0]:=878;END;PUTGETERROR;END{:1086};END;{:1085}{1087:}
PROCEDURE DOTFMCOMMAND;LABEL 22;VAR C,CC:EIGHTBITS;K:0..256;J:INTEGER;
BEGIN CASE CURMOD OF 0:{1088:}BEGIN C:=GETCODE;
WHILE CURCMD=79 DO BEGIN CC:=GETCODE;SETTAG(C,2,CC);C:=CC;END;END{:1088}
;1:{1089:}BEGIN 22:C:=GETCODE;IF CURCMD=78 THEN{1092:}
BEGIN IF NL>255 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(888);END;BEGIN HELPPTR:=1;HELPLINE[0]:=889;END;ERROR;
END ELSE SETTAG(C,1,NL);GOTO 22;END{:1092};
IF CURCMD=76 THEN BEGIN{1093:}LIGKERN[NL].B1:=0+C+0;
LIGKERN[NL].B2:=0+CURMOD+0;LIGKERN[NL].B0:=0;
IF CURMOD=0 THEN LIGKERN[NL].B3:=0+GETCODE+0 ELSE BEGIN GETXNEXT;
SCANEXPRESSI;IF CURTYPE<>15 THEN BEGIN DISPERR(0,890);BEGIN HELPPTR:=2;
HELPLINE[1]:=891;HELPLINE[0]:=181;END;PUTGETFLUSHE(0);END;
KERN[NK]:=CUREXP;K:=0;WHILE KERN[K]<>CUREXP DO K:=K+1;
IF K=NK THEN BEGIN IF NK=256 THEN OVERFLOW(887,256);NK:=NK+1;END;
LIGKERN[NL].B3:=0+K+0;END{:1093};
IF NL=LIGTABLESIZE THEN OVERFLOW(883,LIGTABLESIZE);NL:=NL+1;
IF CURCMD=79 THEN GOTO 22;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(884);END;BEGIN HELPPTR:=1;HELPLINE[0]:=885;END;BACKERROR;END;
IF NL>0 THEN LIGKERN[NL-1].B0:=128;END{:1089};2:{1094:}
BEGIN IF NE=256 THEN OVERFLOW(864,256);C:=GETCODE;SETTAG(C,3,NE);
IF CURCMD<>78 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=1;
HELPLINE[0]:=892;END;BACKERROR;END;EXTEN[NE].B0:=0+GETCODE+0;
IF CURCMD<>79 THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=1;
HELPLINE[0]:=892;END;BACKERROR;END;EXTEN[NE].B1:=0+GETCODE+0;
IF CURCMD<>79 THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=1;
HELPLINE[0]:=892;END;BACKERROR;END;EXTEN[NE].B2:=0+GETCODE+0;
IF CURCMD<>79 THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=1;
HELPLINE[0]:=892;END;BACKERROR;END;EXTEN[NE].B3:=0+GETCODE+0;NE:=NE+1;
END{:1094};3,4:BEGIN C:=CURMOD;GETXNEXT;SCANEXPRESSI;
IF(CURTYPE<>15)OR(CUREXP<32768)THEN BEGIN DISPERR(0,879);
BEGIN HELPPTR:=2;HELPLINE[1]:=880;HELPLINE[0]:=881;END;PUTGETERROR;
END ELSE BEGIN J:=ROUNDUNSCALE(CUREXP);
IF CURCMD<>78 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=1;
HELPLINE[0]:=882;END;BACKERROR;END;IF C=3 THEN{1095:}
REPEAT IF J>HEADERSIZE THEN OVERFLOW(865,HEADERSIZE);
HEADERBYTE[J]:=GETCODE;J:=J+1;UNTIL CURCMD<>79{:1095}ELSE{1096:}
REPEAT IF J>MAXFONTDIMEN THEN OVERFLOW(866,MAXFONTDIMEN);
WHILE J>NP DO BEGIN NP:=NP+1;PARAM[NP]:=0;END;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>15 THEN BEGIN DISPERR(0,893);BEGIN HELPPTR:=1;
HELPLINE[0]:=181;END;PUTGETFLUSHE(0);END;PARAM[J]:=CUREXP;J:=J+1;
UNTIL CURCMD<>79{:1096};END;END;END;END;{:1087}{1155:}
PROCEDURE DOSPECIAL;VAR M:SMALLNUMBER;BEGIN M:=CURMOD;GETXNEXT;
SCANEXPRESSI;IF INTERNAL[33]>=0 THEN IF CURTYPE<>M THEN{1156:}
BEGIN DISPERR(0,908);BEGIN HELPPTR:=1;HELPLINE[0]:=909;END;PUTGETERROR;
END{:1156}ELSE BEGIN IF OUTPUTFILENA=0 THEN INITGF;IF M=4 THEN{1158:}
BEGIN IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])<=255 THEN BEGIN BEGIN
GFBUF[GFPTR]:=239;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=(STRSTART[CUREXP+1]-STRSTART[CUREXP]);
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
END ELSE BEGIN BEGIN GFBUF[GFPTR]:=241;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFTHREE((STRSTART[CUREXP+1]-STRSTART[CUREXP]));END;GFSTRING(CUREXP);
END{:1158}ELSE{1157:}BEGIN BEGIN GFBUF[GFPTR]:=243;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(CUREXP);END{:1157};END;
FLUSHCUREXP(0);END;{:1155}{1166:}PROCEDURE STOREBASEFIL;VAR K:INTEGER;
P,Q:HALFWORD;X:INTEGER;W:FOURQUARTERS;BEGIN{1180:}SELECTOR:=5;
PRINT(920);PRINT(JOBNAME);PRINTCHAR(32);
PRINTINT(ROUNDUNSCALE(INTERNAL[13])MOD 100);PRINTCHAR(46);
PRINTINT(ROUNDUNSCALE(INTERNAL[14]));PRINTCHAR(46);
PRINTINT(ROUNDUNSCALE(INTERNAL[15]));PRINTCHAR(41);
IF INTERACTION=0 THEN SELECTOR:=2 ELSE SELECTOR:=3;
BEGIN IF POOLPTR+1>MAXPOOLPTR THEN BEGIN IF POOLPTR+1>POOLSIZE THEN
OVERFLOW(129,POOLSIZE-INITPOOLPTR);MAXPOOLPTR:=POOLPTR+1;END;END;
BASEIDENT:=MAKESTRING;STRREF[BASEIDENT]:=127;PACKJOBNAME(921);
WHILE NOT WOPENOUT(BASEFILE)DO PROMPTFILENA(922,921);PRINTNL(923);
PRINT(WMAKENAMESTR(BASEFILE));FLUSHSTRING(STRPTR-1);
PRINTNL(BASEIDENT){:1180};{1170:}BEGIN BASEFILE↑.INT:=52045111;
PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=0;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=3000;PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=2100;
PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=1777;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=6;PUT(BASEFILE);END{:1170};{1172:}
BEGIN BASEFILE↑.INT:=POOLPTR;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=STRPTR;PUT(BASEFILE);END;
FOR K:=0 TO STRPTR DO BEGIN BASEFILE↑.INT:=STRSTART[K];PUT(BASEFILE);
END;K:=0;WHILE K+4<POOLPTR DO BEGIN W.B0:=STRPOOL[K];W.B1:=STRPOOL[K+1];
W.B2:=STRPOOL[K+2];W.B3:=STRPOOL[K+3];BEGIN BASEFILE↑.QQQQ:=W;
PUT(BASEFILE);END;K:=K+4;END;K:=POOLPTR-4;W.B0:=STRPOOL[K];
W.B1:=STRPOOL[K+1];W.B2:=STRPOOL[K+2];W.B3:=STRPOOL[K+3];
BEGIN BASEFILE↑.QQQQ:=W;PUT(BASEFILE);END;PRINTLN;PRINTINT(STRPTR);
PRINT(917);PRINTINT(POOLPTR){:1172};{1174:}SORTAVAIL;VARUSED:=0;
BEGIN BASEFILE↑.INT:=LOMEMMAX;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=ROVER;PUT(BASEFILE);END;P:=0;Q:=ROVER;X:=0;
REPEAT FOR K:=P TO Q+1 DO BEGIN BASEFILE↑:=MEM[K];PUT(BASEFILE);END;
X:=X+Q+2-P;VARUSED:=VARUSED+Q-P;P:=Q+MEM[Q].HH.LH;Q:=MEM[Q+1].HH.RH;
UNTIL Q=ROVER;VARUSED:=VARUSED+LOMEMMAX-P;DYNUSED:=MEMEND+1-HIMEMMIN;
FOR K:=P TO LOMEMMAX DO BEGIN BASEFILE↑:=MEM[K];PUT(BASEFILE);END;
X:=X+LOMEMMAX+1-P;BEGIN BASEFILE↑.INT:=HIMEMMIN;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=AVAIL;PUT(BASEFILE);END;
FOR K:=HIMEMMIN TO MEMEND DO BEGIN BASEFILE↑:=MEM[K];PUT(BASEFILE);END;
X:=X+MEMEND+1-HIMEMMIN;P:=AVAIL;WHILE P<>0 DO BEGIN DYNUSED:=DYNUSED-1;
P:=MEM[P].HH.RH;END;BEGIN BASEFILE↑.INT:=VARUSED;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=DYNUSED;PUT(BASEFILE);END;PRINTLN;PRINTINT(X);
PRINT(918);PRINTINT(VARUSED);PRINTCHAR(38);PRINTINT(DYNUSED){:1174};
{1176:}BEGIN BASEFILE↑.INT:=HASHUSED;PUT(BASEFILE);END;
STCOUNT:=2228-HASHUSED;
FOR P:=1 TO HASHUSED DO IF HASH[P].RH<>0 THEN BEGIN BEGIN BASEFILE↑.INT
:=P;PUT(BASEFILE);END;BEGIN BASEFILE↑.HH:=HASH[P];PUT(BASEFILE);END;
BEGIN BASEFILE↑.HH:=EQTB[P];PUT(BASEFILE);END;STCOUNT:=STCOUNT+1;END;
FOR P:=HASHUSED+1 TO 2242 DO BEGIN BEGIN BASEFILE↑.HH:=HASH[P];
PUT(BASEFILE);END;BEGIN BASEFILE↑.HH:=EQTB[P];PUT(BASEFILE);END;END;
BEGIN BASEFILE↑.INT:=STCOUNT;PUT(BASEFILE);END;PRINTLN;
PRINTINT(STCOUNT);PRINT(919){:1176};{1178:}BEGIN BASEFILE↑.INT:=INTPTR;
PUT(BASEFILE);END;
FOR K:=1 TO INTPTR DO BEGIN BEGIN BASEFILE↑.INT:=INTERNAL[K];
PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=INTNAME[K];PUT(BASEFILE);END;END;
BEGIN BASEFILE↑.INT:=STARTSYM;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=INTERACTION;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=BASEIDENT;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=69069;PUT(BASEFILE);END;INTERNAL[11]:=0{:1178};
{1181:}WCLOSE(BASEFILE){:1181};END;{:1166}PROCEDURE DOSTATEMENT;
BEGIN CURTYPE:=1;GETXNEXT;IF CURCMD>43 THEN{972:}
BEGIN IF CURCMD<80 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(733);END;PRINTCMDMOD(CURCMD,CURMOD);PRINTCHAR(39);
BEGIN HELPPTR:=5;HELPLINE[4]:=734;HELPLINE[3]:=735;HELPLINE[2]:=736;
HELPLINE[1]:=737;HELPLINE[0]:=738;END;BACKERROR;GETNEXT;END;END{:972}
ELSE IF CURCMD>30 THEN{975:}BEGIN VARFLAG:=77;SCANEXPRESSI;
IF CURCMD<81 THEN BEGIN IF CURCMD=51 THEN DOEQUATION ELSE IF CURCMD=77
THEN DOASSIGNMENT ELSE IF CURTYPE=4 THEN{976:}
BEGIN IF INTERNAL[1]>0 THEN BEGIN PRINTNL(157);SLOWPRINT(CUREXP);
BREAK(TTY);END;IF INTERNAL[33]>0 THEN{1159:}
BEGIN IF OUTPUTFILENA=0 THEN INITGF;
IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])<=249 THEN BEGIN BEGIN GFBUF[
GFPTR]:=239;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=(STRSTART[CUREXP+1]-STRSTART[CUREXP])+6;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
END ELSE BEGIN BEGIN GFBUF[GFPTR]:=241;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFTHREE((STRSTART[CUREXP+1]-STRSTART[CUREXP])+6);END;GFSTRING(910);
GFSTRING(CUREXP);END{:1159};END{:976}
ELSE IF CURTYPE<>1 THEN BEGIN DISPERR(0,743);BEGIN HELPPTR:=3;
HELPLINE[2]:=744;HELPLINE[1]:=745;HELPLINE[0]:=746;END;PUTGETERROR;END;
FLUSHCUREXP(0);CURTYPE:=1;END;END{:975}ELSE{974:}
BEGIN IF INTERNAL[7]>0 THEN SHOWCMDMOD(CURCMD,CURMOD);
CASE CURCMD OF 30:DOTYPEDECLAR;
16:IF CURMOD>2 THEN MAKEOPDEF ELSE IF CURMOD>0 THEN SCANDEF;{1002:}
24:DORANDOMSEED;{:1002}{1004:}23:BEGIN PRINTLN;INTERACTION:=CURMOD;{70:}
IF INTERACTION=0 THEN SELECTOR:=0 ELSE SELECTOR:=1{:70};
IF JOBNAME<>0 THEN SELECTOR:=SELECTOR+2;GETXNEXT;END;{:1004}{1007:}
21:DOPROTECTION;{:1007}{1011:}27:DEFDELIMS;{:1011}{1014:}
12:REPEAT GETSYMBOL;SAVEVARIABLE(CURSYM);GETXNEXT;UNTIL CURCMD<>79;
13:DOINTERIM;14:DOLET;15:DONEWINTERNA;{:1014}{1020:}22:DOSHOWWHATEV;
{:1020}{1039:}18:DOADDTO;{:1039}{1050:}17:DOSHIPOUT;11:DODISPLAY;
28:DOOPENWINDOW;19:DOCULL;{:1050}{1057:}26:BEGIN GETSYMBOL;
STARTSYM:=CURSYM;GETXNEXT;END;{:1057}{1062:}25:DOMESSAGE;{:1062}{1081:}
20:DOTFMCOMMAND;{:1081}{1153:}29:DOSPECIAL;{:1153}END;CURTYPE:=1;
END{:974};IF CURCMD<80 THEN{973:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(739);
END;BEGIN HELPPTR:=6;HELPLINE[5]:=740;HELPLINE[4]:=741;HELPLINE[3]:=742;
HELPLINE[2]:=736;HELPLINE[1]:=737;HELPLINE[0]:=738;END;BACKERROR;
SCANNERSTATU:=2;REPEAT GETNEXT;{727:}
IF CURCMD=39 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:727}
;UNTIL CURCMD>79;SCANNERSTATU:=0;END{:973};ERRORCOUNT:=0;END;{:971}
{999:}PROCEDURE MAINCONTROL;BEGIN REPEAT DOSTATEMENT;
IF CURCMD=81 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(771);END;BEGIN HELPPTR:=2;HELPLINE[1]:=772;
HELPLINE[0]:=552;END;FLUSHERROR(0);END;UNTIL CURCMD=82;END;{:999}{1098:}
FUNCTION SORTIN(V:SCALED):HALFWORD;LABEL 40;VAR P,Q,R:HALFWORD;
BEGIN P:=2999;WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;
IF V<=MEM[Q+1].INT THEN GOTO 40;P:=Q;END;
40:IF V<MEM[Q+1].INT THEN BEGIN R:=GETNODE(2);MEM[R+1].INT:=V;
MEM[R].HH.RH:=Q;MEM[P].HH.RH:=R;END;SORTIN:=MEM[P].HH.RH;END;{:1098}
{1099:}FUNCTION MINCOVER(D:SCALED):INTEGER;VAR P:HALFWORD;L:SCALED;
M:INTEGER;BEGIN M:=0;P:=MEM[2999].HH.RH;PERTURBATION:=2147483647;
WHILE P<>19 DO BEGIN M:=M+1;L:=MEM[P+1].INT;REPEAT P:=MEM[P].HH.RH;
UNTIL MEM[P+1].INT>L+D;
IF MEM[P+1].INT-L<PERTURBATION THEN PERTURBATION:=MEM[P+1].INT-L;END;
MINCOVER:=M;END;{:1099}{1101:}FUNCTION THRESHOLD(M:INTEGER):SCALED;
VAR D:SCALED;
BEGIN IF MINCOVER(0)<=M THEN THRESHOLD:=0 ELSE BEGIN REPEAT D:=
PERTURBATION;UNTIL MINCOVER(D+D)<=M;
WHILE MINCOVER(D)>M DO D:=PERTURBATION;THRESHOLD:=D;END;END;{:1101}
{1102:}FUNCTION SKIMP(M:INTEGER):INTEGER;VAR D:SCALED;P,Q,R:HALFWORD;
L:SCALED;V:SCALED;BEGIN D:=THRESHOLD(M);PERTURBATION:=0;Q:=2999;M:=0;
P:=MEM[2999].HH.RH;WHILE P<>19 DO BEGIN M:=M+1;L:=MEM[P+1].INT;
MEM[P].HH.LH:=M;IF MEM[MEM[P].HH.RH+1].INT<=L+D THEN{1103:}
BEGIN REPEAT P:=MEM[P].HH.RH;MEM[P].HH.LH:=M;
UNTIL MEM[MEM[P].HH.RH+1].INT>L+D;V:=(L+MEM[P+1].INT)DIV 2;
IF MEM[P+1].INT-V>PERTURBATION THEN PERTURBATION:=MEM[P+1].INT-V;R:=Q;
REPEAT R:=MEM[R].HH.RH;MEM[R+1].INT:=V;UNTIL R=P;MEM[Q].HH.RH:=P;
END{:1103};Q:=P;P:=MEM[P].HH.RH;END;SKIMP:=M;END;{:1102}{1104:}
PROCEDURE TFMWARNING(M:SMALLNUMBER);BEGIN PRINTNL(894);
PRINT(INTNAME[M]);PRINT(895);PRINTSCALED(PERTURBATION);PRINT(896);END;
{:1104}{1109:}PROCEDURE FIXCHECKSUM;VAR K:EIGHTBITS;
B1,B2,B3,B4:EIGHTBITS;X:INTEGER;
BEGIN IF HEADERBYTE[1]<0 THEN IF HEADERBYTE[2]<0 THEN IF HEADERBYTE[3]<0
THEN IF HEADERBYTE[4]<0 THEN BEGIN{1111:}B1:=0;B2:=0;B3:=BC;B4:=EC;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN BEGIN X:=((MEM[TFMWIDTH[K]+1].
INT+8)DIV 16)+K*4194304;IF X<0 THEN X:=X+1073741823;
B1:=(B1+B1+X)MOD 256;B2:=(B2+B2+(X MOD 255))MOD 256;
B3:=(B3+B3+(X MOD 253))MOD 256;B4:=(B4+B4+(X MOD 251))MOD 256;END;
{:1111};HEADERBYTE[1]:=B1;HEADERBYTE[2]:=B2;HEADERBYTE[3]:=B3;
HEADERBYTE[4]:=B4;END;
FOR K:=1 TO 4 DO IF HEADERBYTE[K]<0 THEN HEADERBYTE[K]:=0;END;{:1109}
{1110:}PROCEDURE FIXDESIGNSIZ;VAR D:SCALED;BEGIN D:=INTERNAL[25];
IF(D<65536)OR(D>=134217728)THEN BEGIN IF D<>0 THEN PRINTNL(897);
D:=8388608;INTERNAL[25]:=D;END;
IF HEADERBYTE[5]<0 THEN IF HEADERBYTE[6]<0 THEN IF HEADERBYTE[7]<0 THEN
IF HEADERBYTE[8]<0 THEN BEGIN HEADERBYTE[5]:=D DIV 1048576;
HEADERBYTE[6]:=(D DIV 4096)MOD 256;HEADERBYTE[7]:=(D DIV 16)MOD 256;
HEADERBYTE[8]:=(D MOD 16)*16;END;
MAXTFMDIMEN:=16*INTERNAL[25]-INTERNAL[25]DIV 2097152;
IF MAXTFMDIMEN>=134217728 THEN MAXTFMDIMEN:=134217727;END;{:1110}{1112:}
PROCEDURE TFMTWO(X:INTEGER);BEGIN WRITE(TFMFILE,X DIV 256);
WRITE(TFMFILE,X MOD 256);END;PROCEDURE TFMFOUR(X:INTEGER);
BEGIN IF X>=0 THEN WRITE(TFMFILE,X DIV 16777216)ELSE BEGIN X:=X
+1073741824;X:=X+1073741824;WRITE(TFMFILE,(X DIV 16777216)+128);END;
X:=X MOD 16777216;WRITE(TFMFILE,X DIV 65536);X:=X MOD 65536;
WRITE(TFMFILE,X DIV 256);WRITE(TFMFILE,X MOD 256);END;
PROCEDURE TFMQQQQ(X:FOURQUARTERS);BEGIN WRITE(TFMFILE,0+X.B0-0);
WRITE(TFMFILE,0+X.B1-0);WRITE(TFMFILE,0+X.B2-0);WRITE(TFMFILE,0+X.B3-0);
END;{:1112}{1116:}PROCEDURE TFMDIMENOUT(X:SCALED);
BEGIN IF ABS(X)>MAXTFMDIMEN THEN BEGIN TFMCHANGED:=TFMCHANGED+1;
IF X>0 THEN X:=16777215 ELSE X:=-16777215;
END ELSE X:=MAKESCALED(X*16,INTERNAL[25]);TFMFOUR(X);END;{:1116}{1167:}
{763:}FUNCTION OPENBASEFILE:BOOLEAN;LABEL 40,10;VAR J:0..BUFSIZE;
BEGIN J:=CURINPUT.LOCFIELD;
IF BUFFER[CURINPUT.LOCFIELD]=38 THEN BEGIN CURINPUT.LOCFIELD:=CURINPUT.
LOCFIELD+1;J:=CURINPUT.LOCFIELD;BUFFER[LAST]:=32;
WHILE BUFFER[J]<>32 DO J:=J+1;PACKBUFFERED(0,CURINPUT.LOCFIELD,J-1);
IF WOPENIN(BASEFILE)THEN GOTO 40;PACKBUFFERED(8,CURINPUT.LOCFIELD,J-1);
IF WOPENIN(BASEFILE)THEN GOTO 40;WAKEUPTERMIN;
WRITELN(TTY,'Sorry, I can''t find that base;',' will try PLAIN.');
BREAK(TTY);END;PACKBUFFERED(13,1,0);
IF NOT WOPENIN(BASEFILE)THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'I can''t find the PLAIN base file!');OPENBASEFILE:=FALSE;
GOTO 10;END;40:CURINPUT.LOCFIELD:=J;OPENBASEFILE:=TRUE;10:END;{:763}
FUNCTION LOADBASEFILE:BOOLEAN;LABEL 6666,10;VAR K:INTEGER;P,Q:HALFWORD;
X:INTEGER;W:FOURQUARTERS;BEGIN{1171:}X:=BASEFILE↑.INT;
IF X<>52045111 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>0 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>3000 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>2100 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>1777 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>6 THEN GOTO 6666{:1171};{1173:}BEGIN BEGIN GET(BASEFILE);
X:=BASEFILE↑.INT;END;IF X<0 THEN GOTO 6666;
IF X>POOLSIZE THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'---! Must increase the ','string pool size');GOTO 6666;
END ELSE POOLPTR:=X;END;BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<0 THEN GOTO 6666;IF X>MAXSTRINGS THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'---! Must increase the ','max strings');GOTO 6666;
END ELSE STRPTR:=X;END;
FOR K:=0 TO STRPTR DO BEGIN BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;
END;IF(X<0)OR(X>POOLPTR)THEN GOTO 6666 ELSE STRSTART[K]:=X;END;
STRREF[K]:=127;END;K:=0;WHILE K+4<POOLPTR DO BEGIN BEGIN GET(BASEFILE);
W:=BASEFILE↑.QQQQ;END;STRPOOL[K]:=W.B0;STRPOOL[K+1]:=W.B1;
STRPOOL[K+2]:=W.B2;STRPOOL[K+3]:=W.B3;K:=K+4;END;K:=POOLPTR-4;
BEGIN GET(BASEFILE);W:=BASEFILE↑.QQQQ;END;STRPOOL[K]:=W.B0;
STRPOOL[K+1]:=W.B1;STRPOOL[K+2]:=W.B2;STRPOOL[K+3]:=W.B3{:1173};{1175:}
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<1022)OR(X>2998)THEN GOTO 6666 ELSE LOMEMMAX:=X;END;
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<23)OR(X>LOMEMMAX)THEN GOTO 6666 ELSE ROVER:=X;END;P:=0;Q:=ROVER;
X:=0;REPEAT FOR K:=P TO Q+1 DO BEGIN GET(BASEFILE);MEM[K]:=BASEFILE↑;
END;P:=Q+MEM[Q].HH.LH;
IF(P>LOMEMMAX)OR((Q>=MEM[Q+1].HH.RH)AND(MEM[Q+1].HH.RH<>ROVER))THEN GOTO
6666;Q:=MEM[Q+1].HH.RH;UNTIL Q=ROVER;
FOR K:=P TO LOMEMMAX DO BEGIN GET(BASEFILE);MEM[K]:=BASEFILE↑;END;
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<LOMEMMAX+1)OR(X>2999)THEN GOTO 6666 ELSE HIMEMMIN:=X;END;
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>3000)THEN GOTO 6666 ELSE AVAIL:=X;END;MEMEND:=3000;
FOR K:=HIMEMMIN TO MEMEND DO BEGIN GET(BASEFILE);MEM[K]:=BASEFILE↑;END;
BEGIN GET(BASEFILE);VARUSED:=BASEFILE↑.INT;END;BEGIN GET(BASEFILE);
DYNUSED:=BASEFILE↑.INT;END{:1175};{1177:}BEGIN BEGIN GET(BASEFILE);
X:=BASEFILE↑.INT;END;IF(X<1)OR(X>2229)THEN GOTO 6666 ELSE HASHUSED:=X;
END;P:=0;REPEAT BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<P+1)OR(X>HASHUSED)THEN GOTO 6666 ELSE P:=X;END;BEGIN GET(BASEFILE);
HASH[P]:=BASEFILE↑.HH;END;BEGIN GET(BASEFILE);EQTB[P]:=BASEFILE↑.HH;END;
UNTIL P=HASHUSED;FOR P:=HASHUSED+1 TO 2242 DO BEGIN BEGIN GET(BASEFILE);
HASH[P]:=BASEFILE↑.HH;END;BEGIN GET(BASEFILE);EQTB[P]:=BASEFILE↑.HH;END;
END;BEGIN GET(BASEFILE);STCOUNT:=BASEFILE↑.INT;END{:1177};{1179:}
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<38)OR(X>MAXINTERNAL)THEN GOTO 6666 ELSE INTPTR:=X;END;
FOR K:=1 TO INTPTR DO BEGIN BEGIN GET(BASEFILE);
INTERNAL[K]:=BASEFILE↑.INT;END;BEGIN BEGIN GET(BASEFILE);
X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>STRPTR)THEN GOTO 6666 ELSE INTNAME[K]:=X;END;END;
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>2229)THEN GOTO 6666 ELSE STARTSYM:=X;END;
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>3)THEN GOTO 6666 ELSE INTERACTION:=X;END;
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>STRPTR)THEN GOTO 6666 ELSE BASEIDENT:=X;END;
BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<>69069)OR EOF(BASEFILE)THEN GOTO 6666{:1179};LOADBASEFILE:=TRUE;
GOTO 10;6666:WAKEUPTERMIN;
WRITELN(TTY,'(Fatal base file error; I''m stymied)');
LOADBASEFILE:=FALSE;10:END;{:1167}{1182:}{806:}PROCEDURE SCANPRIMARY;
LABEL 20,30,31,10;VAR P,Q:HALFWORD;C:QUARTERWORD;MYVARFLAG:0..82;
LDELIM,RDELIM:HALFWORD;{814:}GROUPLINE:INTEGER;{:814}{819:}
NUM,DENOM:SCALED;{:819}{826:}PREHEAD,POSTHEAD,TAIL:HALFWORD;
TT:SMALLNUMBER;T:HALFWORD;MACROREF:HALFWORD;{:826}
BEGIN MYVARFLAG:=VARFLAG;VARFLAG:=0;
20:BEGIN IF ARITHERROR THEN CLEARARITH;END;{808:}
IF PANICKING THEN CHECKMEM(FALSE);
IF INTERRUPT<>0 THEN IF OKTOINTERRUP THEN BEGIN BACKINPUT;
BEGIN IF INTERRUPT<>0 THEN PAUSEFORINST;END;GETXNEXT;END{:808};
CASE CURCMD OF 31:{809:}BEGIN LDELIM:=CURSYM;RDELIM:=CURMOD;GETXNEXT;
SCANEXPRESSI;IF(CURCMD=79)AND(CURTYPE>=15)THEN{813:}BEGIN P:=GETNODE(2);
MEM[P].HH.B0:=14;MEM[P].HH.B1:=11;INITBIGNODE(P);Q:=MEM[P+1].INT;
STASHIN(Q);GETXNEXT;SCANEXPRESSI;
IF CURTYPE<15 THEN BEGIN DISPERR(0,639);BEGIN HELPPTR:=4;
HELPLINE[3]:=640;HELPLINE[2]:=641;HELPLINE[1]:=642;HELPLINE[0]:=643;END;
PUTGETFLUSHE(0);END;STASHIN(Q+2);CHECKDELIMIT(LDELIM,RDELIM);
CURTYPE:=14;CUREXP:=P;END{:813}ELSE CHECKDELIMIT(LDELIM,RDELIM);
END{:809};32:{815:}BEGIN GROUPLINE:=LINE;
IF INTERNAL[7]>0 THEN SHOWCMDMOD(CURCMD,CURMOD);BEGIN P:=GETAVAIL;
MEM[P].HH.LH:=0;MEM[P].HH.RH:=SAVEPTR;SAVEPTR:=P;END;REPEAT DOSTATEMENT;
UNTIL CURCMD<>80;
IF CURCMD<>81 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(644);END;PRINTINT(GROUPLINE);PRINT(645);
BEGIN HELPPTR:=2;HELPLINE[1]:=646;HELPLINE[0]:=647;END;BACKERROR;
CURCMD:=81;END;UNSAVE;IF INTERNAL[7]>0 THEN SHOWCMDMOD(CURCMD,CURMOD);
END{:815};39:{816:}BEGIN CURTYPE:=4;CUREXP:=CURMOD;END{:816};42:{820:}
BEGIN CUREXP:=CURMOD;CURTYPE:=15;GETXNEXT;
IF CURCMD<>55 THEN BEGIN NUM:=0;DENOM:=0;END ELSE BEGIN GETXNEXT;
IF CURCMD<>42 THEN BEGIN BACKINPUT;CURCMD:=55;CURMOD:=72;CURSYM:=2233;
GOTO 10;END;NUM:=CUREXP;DENOM:=CURMOD;IF DENOM=0 THEN{821:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(648);
END;BEGIN HELPPTR:=1;HELPLINE[0]:=649;END;ERROR;END{:821}
ELSE CUREXP:=MAKESCALED(NUM,DENOM);BEGIN IF ARITHERROR THEN CLEARARITH;
END;GETXNEXT;END;
IF CURCMD>=30 THEN IF CURCMD<42 THEN BEGIN P:=STASHCUREXP;SCANPRIMARY;
IF(ABS(NUM)>=ABS(DENOM))OR(CURTYPE<14)THEN DOBINARY(P,71)ELSE BEGIN
FRACMULT(NUM,DENOM);FREENODE(P,2);END;END;GOTO 10;END{:820};33:{817:}
DONULLARY(CURMOD){:817};34,30,36,43:{818:}BEGIN C:=CURMOD;GETXNEXT;
SCANPRIMARY;DOUNARY(C);GOTO 10;END{:818};37:{822:}BEGIN C:=CURMOD;
GETXNEXT;SCANEXPRESSI;IF CURCMD<>69 THEN BEGIN MISSINGERR(349);
PRINT(578);PRINTCMDMOD(37,C);BEGIN HELPPTR:=1;HELPLINE[0]:=579;END;
BACKERROR;END;P:=STASHCUREXP;GETXNEXT;SCANPRIMARY;DOBINARY(P,C);GOTO 10;
END{:822};35:{823:}BEGIN GETXNEXT;SCANSUFFIX;OLDSETTING:=SELECTOR;
SELECTOR:=5;SHOWTOKENLIS(CUREXP,0,100000);FLUSHTOKENLI(CUREXP);
CUREXP:=MAKESTRING;SELECTOR:=OLDSETTING;CURTYPE:=4;GOTO 10;END{:823};
40:{824:}BEGIN Q:=CURMOD;IF MYVARFLAG=77 THEN BEGIN GETXNEXT;
IF CURCMD=77 THEN BEGIN CUREXP:=GETAVAIL;MEM[CUREXP].HH.LH:=Q+2242;
CURTYPE:=20;GOTO 10;END;BACKINPUT;END;CURTYPE:=15;CUREXP:=INTERNAL[Q];
END{:824};38:MAKEEXPCOPY(CURMOD);41:{827:}BEGIN PREHEAD:=GETAVAIL;
TAIL:=PREHEAD;POSTHEAD:=0;TT:=1;WHILE TRUE DO BEGIN T:=CURTOK;
MEM[TAIL].HH.RH:=T;IF TT<>0 THEN BEGIN{833:}BEGIN P:=MEM[PREHEAD].HH.RH;
Q:=MEM[P].HH.LH;TT:=0;IF EQTB[Q].LH MOD 83=41 THEN BEGIN Q:=EQTB[Q].RH;
IF Q=0 THEN GOTO 31;WHILE TRUE DO BEGIN P:=MEM[P].HH.RH;
IF P=0 THEN BEGIN TT:=MEM[Q].HH.B0;GOTO 31;END;
IF MEM[Q].HH.B0<>21 THEN GOTO 31;Q:=MEM[MEM[Q+1].HH.LH].HH.RH;
IF P>=HIMEMMIN THEN BEGIN REPEAT Q:=MEM[Q].HH.RH;
UNTIL MEM[Q+2].HH.LH>=MEM[P].HH.LH;
IF MEM[Q+2].HH.LH>MEM[P].HH.LH THEN GOTO 31;END;END;END;31:END{:833};
IF TT>=22 THEN{828:}BEGIN MEM[TAIL].HH.RH:=0;
IF TT>22 THEN BEGIN POSTHEAD:=GETAVAIL;TAIL:=POSTHEAD;
MEM[TAIL].HH.RH:=T;TT:=0;MACROREF:=MEM[Q+1].INT;
MEM[MACROREF].HH.LH:=MEM[MACROREF].HH.LH+1;END ELSE{836:}
BEGIN P:=GETAVAIL;MEM[PREHEAD].HH.LH:=MEM[PREHEAD].HH.RH;
MEM[PREHEAD].HH.RH:=P;MEM[P].HH.LH:=T;MACROCALL(MEM[Q+1].INT,PREHEAD,0);
GETXNEXT;GOTO 20;END{:836};END{:828};END;GETXNEXT;TAIL:=T;
IF CURCMD=53 THEN{829:}BEGIN GETXNEXT;SCANEXPRESSI;
IF CURCMD<>64 THEN{830:}BEGIN BACKINPUT;BACKEXPR;CURCMD:=53;CURMOD:=0;
CURSYM:=2232;END{:830}ELSE BEGIN IF CURTYPE<>15 THEN BADSUBSCRIPT;
CURCMD:=42;CURMOD:=CUREXP;CURSYM:=0;END;END{:829};
IF CURCMD<40 THEN GOTO 30;IF CURCMD>42 THEN GOTO 30;END;30:{835:}
IF POSTHEAD<>0 THEN{837:}BEGIN BACKINPUT;P:=GETAVAIL;
Q:=MEM[POSTHEAD].HH.RH;MEM[PREHEAD].HH.LH:=MEM[PREHEAD].HH.RH;
MEM[PREHEAD].HH.RH:=POSTHEAD;MEM[POSTHEAD].HH.LH:=Q;
MEM[POSTHEAD].HH.RH:=P;MEM[P].HH.LH:=MEM[Q].HH.RH;MEM[Q].HH.RH:=0;
MACROCALL(MACROREF,PREHEAD,0);
MEM[MACROREF].HH.LH:=MEM[MACROREF].HH.LH-1;GETXNEXT;GOTO 20;END{:837};
Q:=MEM[PREHEAD].HH.RH;BEGIN MEM[PREHEAD].HH.RH:=AVAIL;AVAIL:=PREHEAD;
DYNUSED:=DYNUSED-1;END;IF CURCMD=MYVARFLAG THEN BEGIN CURTYPE:=20;
CUREXP:=Q;GOTO 10;END;P:=FINDVARIABLE(Q);
IF P<>0 THEN MAKEEXPCOPY(P)ELSE BEGIN OBLITERATED(Q);HELPLINE[2]:=661;
HELPLINE[1]:=662;HELPLINE[0]:=663;PUTGETFLUSHE(0);END;FLUSHNODELIS(Q);
GOTO 10{:835};END{:827};OTHERS:BEGIN BADEXP(633);GOTO 20;END END;
GETXNEXT;10:END;{:806}{842:}PROCEDURE SCANSUFFIX;LABEL 30;
VAR H,T:HALFWORD;P:HALFWORD;BEGIN H:=GETAVAIL;T:=H;
WHILE TRUE DO BEGIN IF CURCMD=53 THEN{843:}BEGIN GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>15 THEN BADSUBSCRIPT;
IF CURCMD<>64 THEN BEGIN MISSINGERR(93);BEGIN HELPPTR:=3;
HELPLINE[2]:=665;HELPLINE[1]:=666;HELPLINE[0]:=560;END;BACKERROR;END;
CURCMD:=42;CURMOD:=CUREXP;END{:843};
IF CURCMD=42 THEN P:=NEWNUMTOK(CURMOD)ELSE IF(CURCMD=41)OR(CURCMD=40)
THEN BEGIN P:=GETAVAIL;MEM[P].HH.LH:=CURSYM;END ELSE GOTO 30;
MEM[T].HH.RH:=P;T:=P;GETXNEXT;END;30:CUREXP:=MEM[H].HH.RH;
BEGIN MEM[H].HH.RH:=AVAIL;AVAIL:=H;DYNUSED:=DYNUSED-1;END;CURTYPE:=20;
END;{:842}{844:}PROCEDURE SCANSECONDAR;LABEL 20,22,10;
VAR P,Q,R:HALFWORD;C,D:HALFWORD;MACNAME:HALFWORD;
BEGIN 20:IF(CURCMD<30)OR(CURCMD>43)THEN BADEXP(667);SCANPRIMARY;
22:IF CURCMD>=52 THEN IF CURCMD<=56 THEN BEGIN P:=STASHCUREXP;C:=CURMOD;
D:=CURCMD;IF D=54 THEN BEGIN MACNAME:=CURSYM;
MEM[C].HH.LH:=MEM[C].HH.LH+1;END;GETXNEXT;IF D=53 THEN{846:}
BEGIN SCANEXPRESSI;IF CURCMD<>79 THEN BEGIN{830:}BEGIN BACKINPUT;
BACKEXPR;CURCMD:=53;CURMOD:=0;CURSYM:=2232;END{:830};UNSTASHCUREX(P);
GOTO 10;END;Q:=STASHCUREXP;GETXNEXT;SCANEXPRESSI;
IF CURCMD<>64 THEN BEGIN MISSINGERR(93);BEGIN HELPPTR:=3;
HELPLINE[2]:=668;HELPLINE[1]:=666;HELPLINE[0]:=560;END;BACKERROR;END;
R:=STASHCUREXP;MAKEEXPCOPY(Q);DOBINARY(R,70);DOBINARY(P,71);
DOBINARY(Q,69);GETXNEXT;END{:846}ELSE BEGIN SCANPRIMARY;
IF D<>54 THEN DOBINARY(P,C)ELSE BEGIN BACKINPUT;BINARYMAC(P,C,MACNAME);
MEM[C].HH.LH:=MEM[C].HH.LH-1;GETXNEXT;GOTO 20;END;END;GOTO 22;END;
10:END;{:844}{847:}PROCEDURE SCANTERTIARY;LABEL 20,22;VAR P:HALFWORD;
C,D:HALFWORD;MACNAME:HALFWORD;
BEGIN 20:IF(CURCMD<30)OR(CURCMD>43)THEN BADEXP(669);SCANSECONDAR;
IF CURTYPE=8 THEN MATERIALIZEP;
22:IF CURCMD>=43 THEN IF CURCMD<=45 THEN BEGIN P:=STASHCUREXP;C:=CURMOD;
D:=CURCMD;IF D=44 THEN BEGIN MACNAME:=CURSYM;
MEM[C].HH.LH:=MEM[C].HH.LH+1;END;GETXNEXT;SCANSECONDAR;
IF D<>44 THEN DOBINARY(P,C)ELSE BEGIN BACKINPUT;BINARYMAC(P,C,MACNAME);
MEM[C].HH.LH:=MEM[C].HH.LH-1;GETXNEXT;GOTO 20;END;GOTO 22;END;END;{:847}
{851:}PROCEDURE SCANEXPRESSI;LABEL 20,30,22,25,26,10;
VAR P,Q,R,PP,QQ:HALFWORD;C,D:HALFWORD;MYVARFLAG:0..82;MACNAME:HALFWORD;
CYCLEHIT:BOOLEAN;X,Y:SCALED;T:0..4;BEGIN MYVARFLAG:=VARFLAG;
20:IF(CURCMD<30)OR(CURCMD>43)THEN BADEXP(672);SCANTERTIARY;
22:IF CURCMD>=46 THEN IF CURCMD<=51 THEN IF(CURCMD<>51)OR(MYVARFLAG<>77)
THEN BEGIN P:=STASHCUREXP;C:=CURMOD;D:=CURCMD;
IF D=49 THEN BEGIN MACNAME:=CURSYM;MEM[C].HH.LH:=MEM[C].HH.LH+1;END;
IF(D<48)OR((D=48)AND((MEM[P].HH.B0=14)OR(MEM[P].HH.B0=9)))THEN{852:}
BEGIN CYCLEHIT:=FALSE;{853:}BEGIN UNSTASHCUREX(P);
IF CURTYPE=14 THEN P:=NEWKNOT ELSE IF CURTYPE=9 THEN P:=CUREXP ELSE GOTO
10;Q:=P;WHILE MEM[Q].HH.RH<>P DO Q:=MEM[Q].HH.RH;
IF MEM[P].HH.B0<>0 THEN BEGIN R:=COPYKNOT(P);MEM[Q].HH.RH:=R;Q:=R;END;
MEM[P].HH.B0:=4;MEM[Q].HH.B1:=4;END{:853};25:{857:}
IF CURCMD=46 THEN{862:}BEGIN T:=SCANDIRECTIO;
IF T<>4 THEN BEGIN MEM[Q].HH.B1:=T;MEM[Q+5].INT:=CUREXP;
IF MEM[Q].HH.B0=4 THEN BEGIN MEM[Q].HH.B0:=T;MEM[Q+3].INT:=CUREXP;END;
END;END{:862};D:=CURCMD;IF D=47 THEN{864:}BEGIN GETXNEXT;
IF CURCMD=59 THEN{865:}BEGIN GETXNEXT;Y:=CURCMD;
IF CURCMD=60 THEN GETXNEXT;SCANPRIMARY;{866:}
IF(CURTYPE<>15)OR(CUREXP<49152)THEN BEGIN DISPERR(0,688);
BEGIN HELPPTR:=1;HELPLINE[0]:=689;END;PUTGETFLUSHE(65536);END{:866};
IF Y=60 THEN CUREXP:=-CUREXP;MEM[Q+6].INT:=CUREXP;
IF CURCMD=52 THEN BEGIN GETXNEXT;Y:=CURCMD;IF CURCMD=60 THEN GETXNEXT;
SCANPRIMARY;{866:}
IF(CURTYPE<>15)OR(CUREXP<49152)THEN BEGIN DISPERR(0,688);
BEGIN HELPPTR:=1;HELPLINE[0]:=689;END;PUTGETFLUSHE(65536);END{:866};
IF Y=60 THEN CUREXP:=-CUREXP;END;Y:=CUREXP;END{:865}
ELSE IF CURCMD=58 THEN{867:}BEGIN MEM[Q].HH.B1:=1;T:=1;GETXNEXT;
SCANPRIMARY;KNOWNPAIR;MEM[Q+5].INT:=CURX;MEM[Q+6].INT:=CURY;
IF CURCMD<>52 THEN BEGIN X:=MEM[Q+5].INT;Y:=MEM[Q+6].INT;
END ELSE BEGIN GETXNEXT;SCANPRIMARY;KNOWNPAIR;X:=CURX;Y:=CURY;END;
END{:867}ELSE BEGIN MEM[Q+6].INT:=65536;Y:=65536;BACKINPUT;GOTO 30;END;
IF CURCMD<>47 THEN BEGIN MISSINGERR(283);BEGIN HELPPTR:=1;
HELPLINE[0]:=687;END;BACKERROR;END;30:END{:864}
ELSE IF D<>48 THEN GOTO 26;GETXNEXT;IF CURCMD=46 THEN{863:}
BEGIN T:=SCANDIRECTIO;IF MEM[Q].HH.B1<>1 THEN X:=CUREXP ELSE T:=1;
END{:863}ELSE IF MEM[Q].HH.B1<>1 THEN BEGIN T:=4;X:=0;END{:857};
IF CURCMD=36 THEN{869:}BEGIN CYCLEHIT:=TRUE;GETXNEXT;PP:=P;QQ:=P;
IF D=48 THEN IF P=Q THEN BEGIN D:=47;MEM[Q+6].INT:=65536;Y:=65536;END;
END{:869}ELSE BEGIN SCANTERTIARY;{868:}
BEGIN IF CURTYPE<>9 THEN PP:=NEWKNOT ELSE PP:=CUREXP;QQ:=PP;
WHILE MEM[QQ].HH.RH<>PP DO QQ:=MEM[QQ].HH.RH;
IF MEM[PP].HH.B0<>0 THEN BEGIN R:=COPYKNOT(PP);MEM[QQ].HH.RH:=R;QQ:=R;
END;MEM[PP].HH.B0:=4;MEM[QQ].HH.B1:=4;END{:868};END;{870:}
BEGIN IF D=48 THEN IF(MEM[Q+1].INT<>MEM[PP+1].INT)OR(MEM[Q+2].INT<>MEM[
PP+2].INT)THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(690);END;BEGIN HELPPTR:=3;HELPLINE[2]:=691;
HELPLINE[1]:=692;HELPLINE[0]:=693;END;PUTGETERROR;D:=47;
MEM[Q+6].INT:=65536;Y:=65536;END;{872:}
IF MEM[PP].HH.B1=4 THEN IF(T=3)OR(T=2)THEN BEGIN MEM[PP].HH.B1:=T;
MEM[PP+5].INT:=X;END{:872};IF D=48 THEN{873:}
BEGIN IF MEM[Q].HH.B0=4 THEN IF MEM[Q].HH.B1=4 THEN BEGIN MEM[Q].HH.B0:=
3;MEM[Q+3].INT:=65536;END;
IF MEM[PP].HH.B1=4 THEN IF T=4 THEN BEGIN MEM[PP].HH.B1:=3;
MEM[PP+5].INT:=65536;END;MEM[Q].HH.B1:=MEM[PP].HH.B1;
MEM[Q].HH.RH:=MEM[PP].HH.RH;MEM[Q+5].INT:=MEM[PP+5].INT;
MEM[Q+6].INT:=MEM[PP+6].INT;FREENODE(PP,7);IF QQ=PP THEN QQ:=Q;END{:873}
ELSE BEGIN{871:}
IF MEM[Q].HH.B1=4 THEN IF(MEM[Q].HH.B0=3)OR(MEM[Q].HH.B0=2)THEN BEGIN
MEM[Q].HH.B1:=MEM[Q].HH.B0;MEM[Q+5].INT:=MEM[Q+3].INT;END{:871};
MEM[Q].HH.RH:=PP;MEM[PP+4].INT:=Y;IF T<>4 THEN BEGIN MEM[PP+3].INT:=X;
MEM[PP].HH.B0:=T;END;END;Q:=QQ;END{:870};
IF CURCMD>=46 THEN IF CURCMD<=48 THEN IF NOT CYCLEHIT THEN GOTO 25;
26:{874:}IF CYCLEHIT THEN BEGIN IF D=48 THEN P:=Q;
END ELSE BEGIN MEM[P].HH.B0:=0;
IF MEM[P].HH.B1=4 THEN BEGIN MEM[P].HH.B1:=3;MEM[P+5].INT:=65536;END;
MEM[Q].HH.B1:=0;IF MEM[Q].HH.B0=4 THEN BEGIN MEM[Q].HH.B0:=3;
MEM[Q+3].INT:=65536;END;MEM[Q].HH.RH:=P;END;MAKECHOICES(P);CURTYPE:=9;
CUREXP:=P{:874};END{:852}ELSE BEGIN GETXNEXT;SCANTERTIARY;
IF D<>49 THEN DOBINARY(P,C)ELSE BEGIN BACKINPUT;BINARYMAC(P,C,MACNAME);
MEM[C].HH.LH:=MEM[C].HH.LH-1;GETXNEXT;GOTO 20;END;END;GOTO 22;END;
10:END;{:851}{875:}PROCEDURE GETBOOLEAN;BEGIN GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>2 THEN BEGIN DISPERR(0,694);BEGIN HELPPTR:=2;
HELPLINE[1]:=695;HELPLINE[0]:=696;END;PUTGETFLUSHE(31);CURTYPE:=2;END;
END;{:875}{223:}PROCEDURE PRINTCAPSULE;BEGIN PRINTCHAR(40);
PRINTEXP(GPOINTER,0);PRINTCHAR(41);END;PROCEDURE TOKENRECYCLE;
BEGIN RECYCLEVALUE(GPOINTER);END;{:223}{1185:}PROCEDURE CLOSEFILESAN;
VAR K:INTEGER;LH:INTEGER;P:HALFWORD;X:SCALED;
BEGIN IF INTERNAL[11]>0 THEN{1188:}
IF JOBNAME>0 THEN BEGIN WRITELN(LOGFILE,' ');
WRITELN(LOGFILE,'Here is how much of METAFONT''s memory',' you used:');
WRITE(LOGFILE,' ',MAXSTRPTR-INITSTRPTR:1,' string');
IF MAXSTRPTR<>INITSTRPTR+1 THEN WRITE(LOGFILE,'s');
WRITELN(LOGFILE,' out of ',MAXSTRINGS-INITSTRPTR:1);
WRITELN(LOGFILE,' ',MAXPOOLPTR-INITPOOLPTR:1,
' string characters out of ',POOLSIZE-INITPOOLPTR:1);
WRITELN(LOGFILE,' ',LOMEMMAX+0+MEMEND-HIMEMMIN+2:1,
' words of memory out of ',MEMEND+1:1);
WRITELN(LOGFILE,' ',STCOUNT:1,' symbolic tokens out of ',2100:1);
WRITELN(LOGFILE,' ',MAXINSTACK:1,'i,',INTPTR:1,'n,',MAXROUNDINGP:1,'r,',
MAXPARAMSTAC:1,'p,',MAXBUFSTACK+1:1,'b stack positions out of ',
STACKSIZE:1,'i,',MAXINTERNAL:1,'n,',MAXWIGGLE:1,'r,',150:1,'p,',BUFSIZE:
1,'b');END{:1188};WAKEUPTERMIN;{1186:}
IF(GFPREVPTR>0)OR(INTERNAL[32]>0)THEN BEGIN{1187:}ROVER:=23;
MEM[ROVER].HH.RH:=65535;LOMEMMAX:=HIMEMMIN-1;
IF LOMEMMAX-ROVER>65535 THEN LOMEMMAX:=65535+ROVER;
MEM[ROVER].HH.LH:=LOMEMMAX-ROVER;MEM[ROVER+1].HH.LH:=ROVER;
MEM[ROVER+1].HH.RH:=ROVER;MEM[LOMEMMAX].HH.RH:=0;
MEM[LOMEMMAX].HH.LH:=0{:1187};{1105:}MEM[2999].HH.RH:=19;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN TFMWIDTH[K]:=SORTIN(TFMWIDTH[K])
;NW:=SKIMP(255)+1;DIMENHEAD[1]:=MEM[2999].HH.RH;
IF PERTURBATION>=4096 THEN TFMWARNING(19){:1105};FIXCHECKSUM;
FIXDESIGNSIZ;IF INTERNAL[32]>0 THEN BEGIN{1107:}MEM[2999].HH.RH:=19;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN IF TFMHEIGHT[K]=0 THEN TFMHEIGHT
[K]:=15 ELSE TFMHEIGHT[K]:=SORTIN(TFMHEIGHT[K]);NH:=SKIMP(15)+1;
DIMENHEAD[2]:=MEM[2999].HH.RH;IF PERTURBATION>=4096 THEN TFMWARNING(20);
MEM[2999].HH.RH:=19;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN IF TFMDEPTH[K]=0 THEN TFMDEPTH[K
]:=15 ELSE TFMDEPTH[K]:=SORTIN(TFMDEPTH[K]);ND:=SKIMP(15)+1;
DIMENHEAD[3]:=MEM[2999].HH.RH;IF PERTURBATION>=4096 THEN TFMWARNING(21);
MEM[2999].HH.RH:=19;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN IF TFMITALCORR[K]=0 THEN
TFMITALCORR[K]:=15 ELSE TFMITALCORR[K]:=SORTIN(TFMITALCORR[K]);
NI:=SKIMP(63)+1;DIMENHEAD[4]:=MEM[2999].HH.RH;
IF PERTURBATION>=4096 THEN TFMWARNING(22){:1107};{1113:}
IF JOBNAME=0 THEN OPENLOGFILE;PACKJOBNAME(605);
WHILE NOT TFMBOPENOUT(TFMFILE)DO PROMPTFILENA(898,605);
METRICFILENA:=BMAKENAMESTR(TFMFILE);{1114:}K:=HEADERSIZE;
WHILE HEADERBYTE[K]<0 DO K:=K-1;LH:=(K+3)DIV 4;IF BC>EC THEN BC:=1;
TFMTWO(6+LH+(EC-BC+1)+NW+NH+ND+NI+NL+NK+NE+NP);TFMTWO(LH);TFMTWO(BC);
TFMTWO(EC);TFMTWO(NW);TFMTWO(NH);TFMTWO(ND);TFMTWO(NI);TFMTWO(NL);
TFMTWO(NK);TFMTWO(NE);TFMTWO(NP);
FOR K:=1 TO 4*LH DO BEGIN IF HEADERBYTE[K]<0 THEN HEADERBYTE[K]:=0;
WRITE(TFMFILE,HEADERBYTE[K]);END{:1114};{1115:}
FOR K:=BC TO EC DO IF NOT CHAREXISTS[K]THEN TFMFOUR(0)ELSE BEGIN WRITE(
TFMFILE,MEM[TFMWIDTH[K]].HH.LH);
WRITE(TFMFILE,(MEM[TFMHEIGHT[K]].HH.LH)*16+MEM[TFMDEPTH[K]].HH.LH);
WRITE(TFMFILE,(MEM[TFMITALCORR[K]].HH.LH)*4+CHARTAG[K]);
WRITE(TFMFILE,CHARREMAINDE[K]);END{:1115};{1118:}TFMCHANGED:=0;
FOR K:=1 TO 4 DO BEGIN TFMFOUR(0);P:=DIMENHEAD[K];
WHILE P<>19 DO BEGIN TFMDIMENOUT(MEM[P+1].INT);P:=MEM[P].HH.RH;END;
END{:1118};{1119:}FOR K:=0 TO NL-1 DO TFMQQQQ(LIGKERN[K]);
FOR K:=0 TO NK-1 DO TFMDIMENOUT(KERN[K]){:1119};{1120:}
FOR K:=0 TO NE-1 DO TFMQQQQ(EXTEN[K]){:1120};{1121:}
FOR K:=1 TO NP DO IF K=1 THEN IF ABS(PARAM[1])<134217728 THEN TFMFOUR(
PARAM[1]*16)ELSE BEGIN TFMCHANGED:=TFMCHANGED+1;
IF PARAM[1]>0 THEN TFMFOUR(2147483647)ELSE TFMFOUR(-2147483647);
END ELSE TFMDIMENOUT(PARAM[K]);
IF TFMCHANGED>0 THEN BEGIN IF TFMCHANGED=1 THEN PRINTNL(900)ELSE BEGIN
PRINTNL(40);PRINTINT(TFMCHANGED);PRINT(901);END;PRINT(902);END{:1121};
PRINTNL(899);PRINT(METRICFILENA);BCLOSE(TFMFILE){:1113};END;
IF GFPREVPTR>0 THEN{1162:}BEGIN BEGIN GFBUF[GFPTR]:=248;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(GFPREVPTR);
GFPREVPTR:=GFOFFSET+GFPTR-5;GFFOUR(INTERNAL[25]*16);
FOR K:=1 TO 4 DO BEGIN GFBUF[GFPTR]:=HEADERBYTE[K];GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(INTERNAL[26]);
GFFOUR(INTERNAL[27]);GFFOUR(GFMINM);GFFOUR(GFMAXM);GFFOUR(GFMINN);
GFFOUR(GFMAXN);
FOR K:=0 TO 255 DO IF CHAREXISTS[K]THEN BEGIN X:=GFDX[K]DIV 65536;
IF(GFDY[K]=0)AND(X>=0)AND(X<256)AND(GFDX[K]=X*65536)THEN BEGIN BEGIN
GFBUF[GFPTR]:=246;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=K;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=X;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
END ELSE BEGIN BEGIN GFBUF[GFPTR]:=245;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=K;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(GFDX[K]);GFFOUR(GFDY[K]);END;
X:=MEM[TFMWIDTH[K]+1].INT;
IF ABS(X)>MAXTFMDIMEN THEN IF X>0 THEN X:=16777215 ELSE X:=-16777215
ELSE X:=MAKESCALED(X*16,INTERNAL[25]);GFFOUR(X);GFFOUR(CHARPTR[K]);END;
BEGIN GFBUF[GFPTR]:=249;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFFOUR(GFPREVPTR);BEGIN GFBUF[GFPTR]:=131;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;K:=4+((GFBUFSIZE-GFPTR)MOD 4);
WHILE K>0 DO BEGIN BEGIN GFBUF[GFPTR]:=223;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;K:=K-1;END;{1136:}
IF GFLIMIT=HALFBUF THEN WRITEGF(HALFBUF,GFBUFSIZE-1);
IF GFPTR>0 THEN WRITEGF(0,GFPTR-1){:1136};PRINTNL(911);
PRINT(OUTPUTFILENA);PRINT(442);PRINTINT(TOTALCHARS);PRINT(912);
IF TOTALCHARS<>1 THEN PRINTCHAR(115);PRINT(913);
PRINTINT(GFOFFSET+GFPTR);PRINT(914);BCLOSE(GFFILE);
IF PSEUDOTYPEIN=0 THEN IF INTERNAL[33]>0 THEN BEGIN K:=SELECTOR;
SELECTOR:=5;POOLPTR:=STRSTART[STRPTR];PRINT(915);PRINT(OUTPUTFILENA);
SELECTOR:=K;
IF POOLPTR<POOLSIZE THEN IF STRPTR<MAXSTRINGS THEN PSEUDOTYPEIN:=
MAKESTRING;END;END{:1162};END{:1186};
IF JOBNAME>0 THEN BEGIN WRITELN(LOGFILE);ACLOSE(LOGFILE);
SELECTOR:=SELECTOR-2;IF SELECTOR=1 THEN BEGIN PRINTNL(924);
PRINT(LOGNAME);PRINTCHAR(46);END;END;
IF(PSEUDOTYPEIN<>0)AND(INTERACTION>0)THEN BEGIN WRITELN(TTY);
FOR K:=STRSTART[PSEUDOTYPEIN]TO STRSTART[PSEUDOTYPEIN+1]-1 DO PTWR1W(0,
ORD(XCHR[STRPOOL[K]]));END;END;{:1185}{1189:}PROCEDURE FINALCLEANUP;
LABEL 10;VAR C:SMALLNUMBER;BEGIN C:=CURMOD;
IF JOBNAME=0 THEN OPENLOGFILE;WHILE CONDPTR<>0 DO BEGIN PRINTNL(925);
PRINTCMDMOD(2,CURIF);IF IFLINE<>0 THEN BEGIN PRINT(926);
PRINTINT(IFLINE);END;PRINT(927);IFLINE:=MEM[CONDPTR+1].INT;
CURIF:=MEM[CONDPTR].HH.B1;CONDPTR:=MEM[CONDPTR].HH.RH;END;
IF HISTORY<>0 THEN IF((HISTORY=1)OR(INTERACTION<3))THEN IF SELECTOR=3
THEN BEGIN SELECTOR:=1;PRINTNL(928);SELECTOR:=3;END;
IF C=1 THEN BEGIN STOREBASEFIL;GOTO 10;PRINTNL(929);GOTO 10;END;10:END;
{:1189}{1190:}PROCEDURE INITPRIM;BEGIN{191:}PRIMITIVE(284,40,1);
PRIMITIVE(285,40,2);PRIMITIVE(286,40,3);PRIMITIVE(287,40,4);
PRIMITIVE(288,40,5);PRIMITIVE(289,40,6);PRIMITIVE(290,40,7);
PRIMITIVE(291,40,8);PRIMITIVE(292,40,9);PRIMITIVE(293,40,10);
PRIMITIVE(294,40,11);PRIMITIVE(295,40,12);PRIMITIVE(296,40,13);
PRIMITIVE(297,40,14);PRIMITIVE(298,40,15);PRIMITIVE(299,40,16);
PRIMITIVE(300,40,17);PRIMITIVE(301,40,18);PRIMITIVE(302,40,19);
PRIMITIVE(303,40,20);PRIMITIVE(304,40,21);PRIMITIVE(305,40,22);
PRIMITIVE(306,40,23);PRIMITIVE(307,40,24);PRIMITIVE(308,40,25);
PRIMITIVE(309,40,26);PRIMITIVE(310,40,27);PRIMITIVE(311,40,28);
PRIMITIVE(312,40,29);PRIMITIVE(313,40,30);PRIMITIVE(314,40,31);
PRIMITIVE(315,40,32);PRIMITIVE(316,40,33);PRIMITIVE(317,40,34);
PRIMITIVE(318,40,35);PRIMITIVE(319,40,36);PRIMITIVE(320,40,37);
PRIMITIVE(321,40,38);{:191}{210:}PRIMITIVE(283,47,0);PRIMITIVE(91,53,0);
EQTB[2232]:=EQTB[CURSYM];PRIMITIVE(93,64,0);PRIMITIVE(125,65,0);
PRIMITIVE(123,46,0);PRIMITIVE(58,78,0);EQTB[2234]:=EQTB[CURSYM];
PRIMITIVE(332,77,0);PRIMITIVE(44,79,0);PRIMITIVE(59,80,0);
EQTB[2235]:=EQTB[CURSYM];PRIMITIVE(92,7,0);PRIMITIVE(333,18,0);
PRIMITIVE(334,72,0);PRIMITIVE(335,60,0);PRIMITIVE(325,32,0);
EQTB[2239]:=EQTB[CURSYM];PRIMITIVE(336,58,0);PRIMITIVE(337,19,0);
PRIMITIVE(338,61,0);PRIMITIVE(339,27,0);PRIMITIVE(340,11,0);
PRIMITIVE(326,81,0);EQTB[2240]:=EQTB[CURSYM];PRIMITIVE(341,26,0);
PRIMITIVE(342,6,0);PRIMITIVE(343,9,0);PRIMITIVE(344,70,0);
PRIMITIVE(345,73,0);PRIMITIVE(346,13,0);PRIMITIVE(347,14,0);
PRIMITIVE(348,15,0);PRIMITIVE(349,69,0);PRIMITIVE(350,28,0);
PRIMITIVE(351,24,0);PRIMITIVE(352,12,0);PRIMITIVE(353,8,0);
PRIMITIVE(354,17,0);PRIMITIVE(355,74,0);PRIMITIVE(356,35,0);
PRIMITIVE(357,59,0);PRIMITIVE(358,71,0);PRIMITIVE(359,75,0);{:210}{668:}
PRIMITIVE(517,16,1);PRIMITIVE(518,16,2);PRIMITIVE(519,16,54);
PRIMITIVE(520,16,44);PRIMITIVE(521,16,49);PRIMITIVE(327,16,0);
EQTB[2237]:=EQTB[CURSYM];PRIMITIVE(522,4,2243);PRIMITIVE(523,4,2393);
PRIMITIVE(524,4,1);PRIMITIVE(328,4,0);EQTB[2236]:=EQTB[CURSYM];{:668}
{673:}PRIMITIVE(525,62,0);PRIMITIVE(526,62,1);PRIMITIVE(64,62,2);
PRIMITIVE(527,62,3);{:673}{680:}PRIMITIVE(538,57,2243);
PRIMITIVE(539,57,2393);PRIMITIVE(540,57,2543);PRIMITIVE(541,57,1);
PRIMITIVE(542,57,2);PRIMITIVE(543,57,3);{:680}{693:}PRIMITIVE(553,3,0);
PRIMITIVE(479,3,1);{:693}{724:}PRIMITIVE(580,1,1);PRIMITIVE(324,2,2);
EQTB[2238]:=EQTB[CURSYM];PRIMITIVE(581,2,3);PRIMITIVE(582,2,4);{:724}
{876:}PRIMITIVE(222,33,30);PRIMITIVE(223,33,31);PRIMITIVE(224,33,32);
PRIMITIVE(225,33,33);PRIMITIVE(226,33,34);PRIMITIVE(227,33,35);
PRIMITIVE(228,33,36);PRIMITIVE(229,33,37);PRIMITIVE(230,34,38);
PRIMITIVE(231,34,39);PRIMITIVE(232,34,40);PRIMITIVE(233,34,41);
PRIMITIVE(234,34,42);PRIMITIVE(235,34,43);PRIMITIVE(236,34,44);
PRIMITIVE(237,34,45);PRIMITIVE(238,34,46);PRIMITIVE(239,34,47);
PRIMITIVE(240,34,48);PRIMITIVE(241,34,49);PRIMITIVE(242,34,50);
PRIMITIVE(243,34,51);PRIMITIVE(244,34,52);PRIMITIVE(245,34,53);
PRIMITIVE(246,34,54);PRIMITIVE(247,34,55);PRIMITIVE(248,34,56);
PRIMITIVE(249,34,57);PRIMITIVE(250,34,58);PRIMITIVE(251,34,59);
PRIMITIVE(252,34,60);PRIMITIVE(253,34,61);PRIMITIVE(254,34,62);
PRIMITIVE(255,34,63);PRIMITIVE(256,34,64);PRIMITIVE(257,34,65);
PRIMITIVE(258,34,66);PRIMITIVE(259,34,67);PRIMITIVE(260,36,68);
PRIMITIVE(43,43,69);PRIMITIVE(45,43,70);PRIMITIVE(42,56,71);
PRIMITIVE(47,55,72);EQTB[2233]:=EQTB[CURSYM];PRIMITIVE(261,45,73);
PRIMITIVE(183,45,74);PRIMITIVE(263,52,76);PRIMITIVE(262,45,75);
PRIMITIVE(60,50,77);PRIMITIVE(264,50,78);PRIMITIVE(62,50,79);
PRIMITIVE(265,50,80);PRIMITIVE(61,51,81);PRIMITIVE(266,50,82);
PRIMITIVE(267,37,94);PRIMITIVE(268,37,95);PRIMITIVE(269,37,96);
PRIMITIVE(270,37,97);PRIMITIVE(271,37,98);PRIMITIVE(272,37,99);
PRIMITIVE(273,37,100);PRIMITIVE(38,48,83);PRIMITIVE(274,56,84);
PRIMITIVE(275,56,85);PRIMITIVE(276,56,86);PRIMITIVE(277,56,87);
PRIMITIVE(278,56,88);PRIMITIVE(279,56,89);PRIMITIVE(280,56,90);
PRIMITIVE(281,56,91);PRIMITIVE(282,45,92);{:876}{995:}
PRIMITIVE(215,30,18);PRIMITIVE(201,30,4);PRIMITIVE(199,30,2);
PRIMITIVE(206,30,9);PRIMITIVE(203,30,6);PRIMITIVE(208,30,11);
PRIMITIVE(210,30,13);PRIMITIVE(211,30,14);{:995}{1000:}
PRIMITIVE(773,82,0);PRIMITIVE(774,82,1);{:1000}{1005:}
PRIMITIVE(145,23,0);PRIMITIVE(146,23,1);PRIMITIVE(147,23,2);
PRIMITIVE(779,23,3);{:1005}{1008:}PRIMITIVE(780,21,0);
PRIMITIVE(781,21,1);{:1008}{1018:}PRIMITIVE(794,22,0);
PRIMITIVE(795,22,1);PRIMITIVE(796,22,2);PRIMITIVE(797,22,3);
PRIMITIVE(798,22,4);{:1018}{1033:}PRIMITIVE(815,68,1);
PRIMITIVE(816,68,0);PRIMITIVE(817,68,2);PRIMITIVE(818,66,6);
PRIMITIVE(819,66,15);PRIMITIVE(820,67,0);PRIMITIVE(821,67,1);{:1033}
{1060:}PRIMITIVE(850,25,0);PRIMITIVE(851,25,1);PRIMITIVE(852,25,2);
{:1060}{1082:}PRIMITIVE(862,20,0);PRIMITIVE(863,20,1);
PRIMITIVE(864,20,2);PRIMITIVE(865,20,3);PRIMITIVE(866,20,4);{:1082}
{1090:}PRIMITIVE(886,76,0);PRIMITIVE(887,76,128);{:1090}{1154:}
PRIMITIVE(906,29,4);PRIMITIVE(907,29,15);{:1154}{1206:}HASH[13].RH:=12;
EQTB[13].LH:=163;{:1206};END;PROCEDURE INITTAB;VAR K:INTEGER;BEGIN{175:}
ROVER:=23;MEM[ROVER].HH.RH:=65535;MEM[ROVER].HH.LH:=1000;
MEM[ROVER+1].HH.LH:=ROVER;MEM[ROVER+1].HH.RH:=ROVER;
LOMEMMAX:=ROVER+1000;MEM[LOMEMMAX].HH.RH:=0;MEM[LOMEMMAX].HH.LH:=0;
FOR K:=2999 TO 3000 DO MEM[K]:=MEM[LOMEMMAX];AVAIL:=0;MEMEND:=3000;
HIMEMMIN:=2999;VARUSED:=23;DYNUSED:=-0;{:175}{192:}INTNAME[1]:=284;
INTNAME[2]:=285;INTNAME[3]:=286;INTNAME[4]:=287;INTNAME[5]:=288;
INTNAME[6]:=289;INTNAME[7]:=290;INTNAME[8]:=291;INTNAME[9]:=292;
INTNAME[10]:=293;INTNAME[11]:=294;INTNAME[12]:=295;INTNAME[13]:=296;
INTNAME[14]:=297;INTNAME[15]:=298;INTNAME[16]:=299;INTNAME[17]:=300;
INTNAME[18]:=301;INTNAME[19]:=302;INTNAME[20]:=303;INTNAME[21]:=304;
INTNAME[22]:=305;INTNAME[23]:=306;INTNAME[24]:=307;INTNAME[25]:=308;
INTNAME[26]:=309;INTNAME[27]:=310;INTNAME[28]:=311;INTNAME[29]:=312;
INTNAME[30]:=313;INTNAME[31]:=314;INTNAME[32]:=315;INTNAME[33]:=316;
INTNAME[34]:=317;INTNAME[35]:=318;INTNAME[36]:=319;INTNAME[37]:=320;
INTNAME[38]:=321;{:192}{202:}HASHUSED:=2229;STCOUNT:=0;
HASH[2241].RH:=323;HASH[2238].RH:=324;HASH[2239].RH:=325;
HASH[2240].RH:=326;HASH[2237].RH:=327;HASH[2236].RH:=328;
HASH[2235].RH:=59;HASH[2234].RH:=58;HASH[2233].RH:=47;HASH[2232].RH:=91;
HASH[2231].RH:=41;HASH[2229].RH:=329;EQTB[2231].LH:=63;{:202}{228:}
MEM[19].HH.LH:=2243;MEM[19].HH.RH:=0;{:228}{323:}MEM[3000].HH.LH:=65535;
{:323}{462:}MEM[3].HH.LH:=0;MEM[3].HH.RH:=0;MEM[4].HH.LH:=1;
MEM[4].HH.RH:=0;FOR K:=5 TO 11 DO MEM[K]:=MEM[4];MEM[12].INT:=0;
MEM[0].HH.RH:=0;MEM[0].HH.LH:=0;MEM[1].INT:=0;MEM[2].INT:=0;{:462}{572:}
MEM[13].HH.RH:=13;MEM[14].HH.LH:=13;MEM[13].HH.LH:=0;MEM[14].HH.RH:=0;
{:572}{686:}MEM[21].HH.B1:=0;MEM[21].HH.RH:=2241;EQTB[2241].RH:=21;
EQTB[2241].LH:=41;{:686}{743:}EQTB[2230].LH:=88;HASH[2230].RH:=597;
{:743}{894:}MEM[17].HH.B1:=11;{:894}{1097:}MEM[20].INT:=1073741824;
{:1097}{1108:}MEM[16].INT:=0;MEM[15].HH.LH:=0;{:1108}{1165:}
BASEIDENT:=916;{:1165}END;{:1190}{1192:}PROCEDURE DEBUGHELP;
LABEL 888,10;VAR K,L,M,N:INTEGER;BEGIN WHILE TRUE DO BEGIN WAKEUPTERMIN;
PRINTNL(930);BREAK(TTY);READ(TTY,M);
IF M<0 THEN GOTO 10 ELSE IF M=0 THEN BEGIN GOTO 888;
888:M:=0;{'BREAKPOINT'}
END ELSE BEGIN READ(TTY,N);CASE M OF{1193:}1:PRINTWORD(MEM[N]);
2:PRINTINT(MEM[N].HH.LH);3:PRINTINT(MEM[N].HH.RH);
4:BEGIN PRINTINT(EQTB[N].LH);PRINTCHAR(58);PRINTINT(EQTB[N].RH);END;
5:PRINTVARIABL(N);6:PRINTINT(INTERNAL[N]);7:DOSHOWDEPEND;
9:SHOWTOKENLIS(N,0,1000);10:PRINT(N);11:CHECKMEM(N>0);12:SEARCHMEM(N);
13:BEGIN READ(TTY,L);PRINTCMDMOD(N,L);END;
14:FOR K:=0 TO N DO PRINT(BUFFER[K]);15:PANICKING:=NOT PANICKING;{:1193}
OTHERS:PRINT(63)END;END;END;10:END;{:1192}{1200:}
{FUNCTION NEXTCOUNT:BOOLEAN;LABEL 30;BEGIN NEXTCOUNT:=TRUE;
WHILE MEMRY.Z<JOBHRL DO BEGIN MEMRY.Z:=MEMRY.Z+1;HACK.Z:=MEMRY.P↑;
IF(HACK.LH=120832)AND(HACK.RH=MEMRY.Z+1)THEN BEGIN MEMRY.Z:=MEMRY.Z+1;
GOTO 30;END;END;NEXTCOUNT:=FALSE;30:END;}{:1200}{1201:}
{PROCEDURE MAGICBEGIN;VAR SUCCESS:BOOLEAN;I:INTEGER;
BEGIN[1199:]HACK.Z:=77;HACK.Z:=HACK.P↑;JOBHRL:=HACK.RH;MEMRY.Z:=131072;
[:1199];[1202:]RESET(COUNTFILE,COUNTNAME,'/O');
IF NOT EOF(COUNTFILE)THEN BEGIN READLN(COUNTFILE,NUMCOUNTS);
WRITELN(TTY,'Reading in ',NUMCOUNTS:1,' counts');I:=0;
WHILE NOT EOF(COUNTFILE)DO BEGIN SUCCESS:=NEXTCOUNT;
READLN(COUNTFILE,MEMRY.P↑);I:=I+1;END;CLOSE(COUNTFILE);
IF SUCCESS THEN SUCCESS:=NOT NEXTCOUNT;
IF NUMCOUNTS<>I THEN SUCCESS:=FALSE;
IF NOT SUCCESS THEN BEGIN WRITELN(TTY,'Bad counter file length');
GOTO 9999;END;END ELSE BEGIN NUMCOUNTS:=0;
WHILE NEXTCOUNT DO NUMCOUNTS:=NUMCOUNTS+1;
WRITELN(TTY,'Initializing ',NUMCOUNTS:1,' zero counts');END;[:1202];END;
}{:1201}{1203:}{PROCEDURE MAGICEND;BEGIN[1199:]HACK.Z:=77;
HACK.Z:=HACK.P↑;JOBHRL:=HACK.RH;MEMRY.Z:=131072;[:1199];
[1204:][1199:]HACK.Z:=77;HACK.Z:=HACK.P↑;JOBHRL:=HACK.RH;
MEMRY.Z:=131072;[:1199];REWRITE(COUNTFILE,COUNTNAME);WRITELN(TTY);
WRITELN(TTY,'Writing ',NUMCOUNTS:1,' count file');
WRITELN(COUNTFILE,NUMCOUNTS);
WHILE NEXTCOUNT DO WRITELN(COUNTFILE,MEMRY.P↑:1);CLOSE(COUNTFILE);
[:1204];END;}{:1203}{:1182}{1184:}BEGIN{MAGICBEGIN;}HISTORY:=3;;
IF READYALREADY=314159 THEN GOTO 1;{14:}BAD:=0;
IF(HALFERRORLIN<30)OR(HALFERRORLIN>ERRORLINE-15)THEN BAD:=1;
IF MAXPRINTLINE<60 THEN BAD:=2;IF GFBUFSIZE MOD 8<>0 THEN BAD:=3;
IF 1100>3000 THEN BAD:=4;IF 1777>2100 THEN BAD:=5;
IF HEADERSIZE MOD 4<>0 THEN BAD:=6;{:14}{153:}
IF MEMMAX<>3000 THEN BAD:=10;IF MEMMAX<3000 THEN BAD:=10;
IF(0>0)OR(255<127)THEN BAD:=11;IF(0>0)OR(65535<32767)THEN BAD:=12;
IF(0<0)OR(255>65535)THEN BAD:=13;IF(0<0)OR(MEMMAX>=65535)THEN BAD:=14;
IF MAXSTRINGS>65535 THEN BAD:=15;IF BUFSIZE>65535 THEN BAD:=16;
IF(255<255)OR(65535<65535)THEN BAD:=17;{:153}{203:}
IF 2242+MAXINTERNAL>65535 THEN BAD:=21;{:203}{213:}
IF 2693>65535 THEN BAD:=22;{:213}{309:}
IF 15*11>BISTACKSIZE THEN BAD:=31;{:309}{539:}
IF 20+17*44>BISTACKSIZE THEN BAD:=32;{:539}{761:}
IF 17>FILENAMESIZE THEN BAD:=41;{:761}IF BAD>0 THEN BEGIN WAKEUPTERMIN;
WRITE(TTY,'Ouch---my internal constants have been',' clobbered!---case '
,BAD:1);GOTO 9999;END;INITIALIZE;IF NOT GETSTRINGSST THEN GOTO 9999;
INITTAB;INITPRIM;READYALREADY:=314159;1:{55:}SELECTOR:=1;TALLY:=0;
TERMOFFSET:=0;FILEOFFSET:=0;{:55}{61:}
WRITE(TTY,'This is METAFONT, Version 0.77');
IF BASEIDENT=0 THEN WRITELN(TTY,' (no base preloaded)')ELSE BEGIN PRINT(
BASEIDENT);PRINTLN;END;BREAK(TTY);{:61}{767:}JOBNAME:=0;{:767}{775:}
OUTPUTFILENA:=0;{:775};{1191:}BEGIN{642:}BEGIN INPUTPTR:=0;
MAXINSTACK:=0;INOPEN:=0;MAXBUFSTACK:=0;PARAMPTR:=0;MAXPARAMSTAC:=0;
FIRST:=1;CURINPUT.STARTFIELD:=1;CURINPUT.INDEXFIELD:=0;LINE:=0;
CURINPUT.NAMEFIELD:=0;FORCEEOF:=FALSE;
IF NOT INITTERMINAL THEN GOTO 9999;CURINPUT.LIMITFIELD:=LAST;
FIRST:=LAST+1;END;{:642}{645:}SCANNERSTATU:=0;{:645};
IF(BASEIDENT=0)OR(BUFFER[CURINPUT.LOCFIELD]=38)THEN BEGIN IF BASEIDENT<>
0 THEN INITIALIZE;IF NOT OPENBASEFILE THEN GOTO 9999;
IF NOT LOADBASEFILE THEN BEGIN WCLOSE(BASEFILE);GOTO 9999;END;
WCLOSE(BASEFILE);
WHILE(CURINPUT.LOCFIELD<CURINPUT.LIMITFIELD)AND(BUFFER[CURINPUT.LOCFIELD
]=32)DO CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;
BUFFER[CURINPUT.LIMITFIELD]:=37;FIXDATEANDTI;
INITRANDOMS((INTERNAL[16]DIV 65536)+INTERNAL[15]);{70:}
IF INTERACTION=0 THEN SELECTOR:=0 ELSE SELECTOR:=1{:70};
IF CURINPUT.LOCFIELD<CURINPUT.LIMITFIELD THEN IF BUFFER[CURINPUT.
LOCFIELD]<>92 THEN STARTINPUT;END{:1191};INITSTRPTR:=STRPTR;
INITPOOLPTR:=POOLPTR;MAXSTRPTR:=STRPTR;MAXPOOLPTR:=POOLPTR;HISTORY:=0;
IF STARTSYM>0 THEN BEGIN CURSYM:=STARTSYM;BACKINPUT;END;MAINCONTROL;
FINALCLEANUP;9998:CLOSEFILESAN;9999:READYALREADY:=0;{MAGICEND;}
END.{:1184}